java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):順序隊(duì)列和循環(huán)隊(duì)列
隊(duì)列:
隊(duì)列是一種受限制的線性表
只允許在表的一端進(jìn)行插入,另一端進(jìn)行刪除
插入的一端稱作隊(duì)尾,刪除的一端稱作隊(duì)頭
具有先進(jìn)先出的特性
順序隊(duì)列:
隊(duì)列底層數(shù)據(jù)采用數(shù)組存儲(chǔ)
設(shè)置隊(duì)頭指針front指向隊(duì)頭元素前一個(gè)位置,初始值為-1
設(shè)置隊(duì)尾指針rear指向隊(duì)尾元素,初始值為-1
判滿:rear == maxSize - 1
判空:rear == front
代碼實(shí)現(xiàn):
//順序隊(duì)列 public class ArrayQueue { private int maxSize; //數(shù)組的最大容量 private int front; //隊(duì)頭指針 private int rear; //隊(duì)尾指針 private int[] array; //存放數(shù)據(jù) public ArrayQueue(int arrMaxSize) { maxSize = arrMaxSize; array = new int[maxSize]; front = -1; //指向隊(duì)頭的前一個(gè)位置 rear = -1; //指向隊(duì)尾 } //判斷隊(duì)列是否滿 public boolean isFull() { return rear == maxSize - 1; } //判斷隊(duì)列是否空 public boolean isEmpty() { return rear == front; } //入隊(duì) public void addQueue(int n) { //判斷隊(duì)列是否滿 if (isFull()) { System.out.println("隊(duì)列滿"); return; } rear++; //rear后移 array[rear] = n; } //出隊(duì) public int getQueue() { //判斷隊(duì)列是否空 if (isEmpty()) { throw new RuntimeException("隊(duì)列為空"); } front++; //front后移 return array[front]; } //取隊(duì)頭數(shù)據(jù) public int headQueue() { if (isEmpty()) { throw new RuntimeException("隊(duì)列為空"); } return array[front + 1]; } //輸出隊(duì)列所有數(shù)據(jù) public void showQueue() { //遍歷輸出 if (isEmpty()) { System.out.println("隊(duì)列為空"); return; } for (int i = 0; i < array.length; i++) { System.out.printf("array[%d] = %d\n", i, array[i]); } } }
順序隊(duì)列存在假溢出現(xiàn)象,故使用循環(huán)隊(duì)列替代順序隊(duì)列
循環(huán)隊(duì)列:
隊(duì)列底層數(shù)據(jù)仍然采用數(shù)組存儲(chǔ)
為了便于判空和判滿,在數(shù)組中預(yù)留一個(gè)空間,認(rèn)為只留下一個(gè)空間的時(shí)候隊(duì)列為滿
設(shè)置隊(duì)頭指針front指向隊(duì)頭元素,初始值為0
設(shè)置隊(duì)尾指針rear指向隊(duì)尾元素的后一個(gè)位置,初始值為0
判滿:(rear + 1) % maxSize == front
判空:rear == front
取得當(dāng)前隊(duì)列有效數(shù)據(jù)個(gè)數(shù):(rear + maxSize - front) % maxSize
代碼實(shí)現(xiàn):
//循環(huán)隊(duì)列 public class CircleQueue { private int maxSize; //數(shù)組的最大容量 private int front; //隊(duì)頭指針 private int rear; //隊(duì)尾指針 private int[] array; //存放數(shù)據(jù) public CircleQueue(int arrMaxSize) { maxSize = arrMaxSize; array = new int[maxSize]; front = 0; //指向隊(duì)頭的前一個(gè)位置 rear = 0; //指向隊(duì)尾 } //判斷隊(duì)列是否滿 public boolean isFull() { return (rear + 1) % maxSize == front; } //判斷隊(duì)列是否空 public boolean isEmpty() { return rear == front; } //入隊(duì) public void addQueue(int n) { //判斷隊(duì)列是否滿 if (isFull()) { System.out.println("隊(duì)列滿"); return; } array[rear] = n; rear = (rear + 1) % maxSize; } //出隊(duì) public int getQueue() { //判斷隊(duì)列是否空 if (isEmpty()) { throw new RuntimeException("隊(duì)列為空"); } //保存front對(duì)應(yīng)的值 int value = array[front]; front = (front + 1) % maxSize; return value; } //取隊(duì)頭數(shù)據(jù) public int headQueue() { if (isEmpty()) { throw new RuntimeException("隊(duì)列為空"); } return array[front]; } //獲取當(dāng)前隊(duì)列有效數(shù)據(jù)個(gè)數(shù) public int size() { return (rear + maxSize - front) % maxSize; } //輸出隊(duì)列所有數(shù)據(jù) public void showQueue() { //遍歷輸出 if (isEmpty()) { System.out.println("隊(duì)列為空"); return; } //從front開始遍歷 for (int i = front; i < front + size(); i++) { System.out.printf("array[%d] = %d\n", i % maxSize, array[i % maxSize]); } } }
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
【MyBatis源碼全面解析】MyBatis一二級(jí)緩存介紹
下面小編就為大家?guī)?lái)一篇【MyBatis源碼全面解析】MyBatis一二級(jí)緩存介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06詳解SpringBoot健康檢查的實(shí)現(xiàn)原理
這篇文章主要介紹了詳解SpringBoot健康檢查的實(shí)現(xiàn)原理,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot框架,感興趣的朋友可以了解下2021-03-03Java獲取漢字對(duì)應(yīng)的拼音(全拼或首字母)
這篇文章主要介紹了Java如何獲取漢字對(duì)應(yīng)的拼音(全拼或首字母),文中實(shí)現(xiàn)的方法是引用了pinyin4j-2.5.0.jar,然后給出了完整的示例代碼,有需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-01-01Spring Boot利用Thymeleaf發(fā)送Email的方法教程
spring Boot默認(rèn)就是使用thymeleaf模板引擎的,下面這篇文章主要給大家介紹了關(guān)于在Spring Boot中利用Thymeleaf發(fā)送Email的方法教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-08-08Java實(shí)戰(zhàn)之客戶信息管理系統(tǒng)
這篇文章主要介紹了Java實(shí)戰(zhàn)之客戶信息管理系統(tǒng),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Java 中利用泛型和反射機(jī)制抽象DAO的實(shí)例
這篇文章主要介紹了Java 中利用泛型和反射機(jī)制抽象DAO的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07