队列与环形队列使用数组模拟
隊(duì)列
該文是觀看尚硅谷韓老師視頻學(xué)習(xí)自己總結(jié)學(xué)習(xí)得,有的是來(lái)源于網(wǎng)絡(luò)收集
隊(duì)列引入
進(jìn)的一端稱為隊(duì)尾(rear),出的一端稱為隊(duì)頭(front)。隊(duì)列可以用順序存儲(chǔ),也可以用鏈?zhǔn)酱鎯?chǔ)。
隊(duì)列介紹
數(shù)組模擬隊(duì)列
隊(duì)列本身是有序列表,若使用數(shù)組的結(jié)構(gòu)來(lái)存儲(chǔ)隊(duì)列的數(shù)據(jù),則隊(duì)列數(shù)組的 如上圖,其中 maxSize 是該隊(duì)列的最大容量。
思路分析
添加數(shù)據(jù)的時(shí)候?qū)⑽仓羔樛笠?#xff1a;rear+1 , 當(dāng) 取出的數(shù)據(jù)front+1,若front == rear 【所明隊(duì)列數(shù)據(jù)為空,并非數(shù)組數(shù)據(jù)空,】
若尾指針 rear 小于隊(duì)列的最大下標(biāo) maxSize-1,則將數(shù)據(jù)存入 rear 所指的數(shù)組元素中,否則無(wú)法存入數(shù)據(jù)。
rear = = maxSize - 1[隊(duì)列滿]
代碼模擬數(shù)組實(shí)現(xiàn)隊(duì)列
package com.fs.demo_2020_07_11_queueArray;import java.util.Scanner;/*** 隊(duì)列* 隊(duì)列是一個(gè)有序列表,可以用數(shù)組或者鏈表來(lái)實(shí)現(xiàn)* 遵循先入先出的原則,先存入的數(shù)據(jù)先取出來(lái),后存入的后取出來(lái)** 數(shù)組模擬隊(duì)列*/ public class QueueArray {public static void main(String[] args) {//測(cè)試一把//創(chuàng)建一個(gè)隊(duì)列SimulationQueueArray queue = new SimulationQueueArray(3);char key = ' '; //接收用戶輸入Scanner scanner = new Scanner(System.in);//boolean loop = true;//輸出一個(gè)菜單while (loop) {System.out.println("s(show): 顯示隊(duì)列");System.out.println("e(exit): 退出程序");System.out.println("a(add): 添加數(shù)據(jù)到隊(duì)列");System.out.println("g(get): 從隊(duì)列取出數(shù)據(jù)");System.out.println("h(head): 查看隊(duì)列頭的數(shù)據(jù)");key = scanner.next().charAt(0);//接收一個(gè)字符switch (key) {case 's':queue.showQueue();break;case 'a':System.out.println("輸出一個(gè)數(shù)");int value = scanner.nextInt();queue.addQueue(value);break;case 'g': //取出數(shù)據(jù)try {int res = queue.getQueue();System.out.printf("取出的數(shù)據(jù)是%d\n", res);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'h': //查看隊(duì)列頭的數(shù)據(jù)try {int res = queue.headQueue();System.out.printf("隊(duì)列頭的數(shù)據(jù)是%d\n", res);} catch (Exception e) {// System.out.println(e.getMessage());e.printStackTrace();}break;case 'e': //退出scanner.close();loop = false;break;default:break;}}System.out.println("程序退出~~");} }//創(chuàng)建一個(gè)類(lèi)來(lái)模擬隊(duì)列 class SimulationQueueArray {private int maxSize;//表示數(shù)字的最大容納量private int front;//模擬指針,默認(rèn)指向數(shù)組有效數(shù)據(jù)索引的前一個(gè)位置private int rear;//模擬指針指向尾部數(shù)據(jù),默認(rèn)初始化指向和front一個(gè)位置,因?yàn)闆](méi)有數(shù)據(jù)private int[] arr;/*** 創(chuàng)建隊(duì)列數(shù)組的構(gòu)造器** @param arrMaxSize 初始化這個(gè)隊(duì)列數(shù)組的容量*/public SimulationQueueArray(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[maxSize];//初始化數(shù)組的容量front = -1;rear = -1;}//判斷隊(duì)列數(shù)組是否滿了public boolean isFull() {//假設(shè)數(shù)組最大索引為2,那么容量就為3,當(dāng)添加3個(gè)數(shù)據(jù)后,rear就加了3次,就是-1+3=2//所以-1+3 = 2 = 3 -1 = 2,所以就滿了return rear == maxSize - 1;}//判斷隊(duì)列是否為空public boolean isEmpty() {//為空有兩中情況,//1.就是數(shù)組中的元素取完了,我還是假設(shè)容量為3,要么一條數(shù)據(jù)都沒(méi)有添加,front和rear都為-1,表示容量為空//2.數(shù)組中的元素添加3個(gè),那么front為2,然后我們又取了3個(gè)元素,那么front也為2,那么rear=front,說(shuō)明數(shù)組中為空return rear == front;}//添加數(shù)據(jù)到隊(duì)列public void addQueue(int data) {//添加前先判斷隊(duì)列是否滿了if (isFull()) {System.out.println("隊(duì)列滿,不能加入數(shù)據(jù)~~~");return;}rear++;//讓指針向后移一下//在rear索引下添加這個(gè)數(shù)據(jù),假設(shè)第一次添加,就是0索引添加data數(shù)據(jù)arr[rear] = data;}//獲取隊(duì)列的數(shù)據(jù),出隊(duì)列public int getQueue() {//先判斷隊(duì)列是否為空if (isEmpty()) {//為空就拋出異常,我們這里結(jié)束方法使用拋出異常方式throw new RuntimeException("隊(duì)列空,不能獲取數(shù)據(jù)~~~");}front++;//先將指針后移,//這里的取出并不是吧數(shù)組中的數(shù)據(jù)真正的取出,而且將指針后移,取出指針后移的這位數(shù)據(jù)//提現(xiàn)了先進(jìn)先出的隊(duì)列思想return arr[front];}//顯示隊(duì)列的所有數(shù)據(jù)public void showQueue() {//同樣先判斷隊(duì)列是否為空if (isEmpty()) {System.out.println("隊(duì)列空,沒(méi)有這個(gè)數(shù)據(jù)~~~");return;}//遍歷for (int i = 0; i < arr.length; i++) {System.out.println("arr[" + i + "]=" + arr[i]);}}//顯示隊(duì)列的頭數(shù)據(jù),不是取數(shù)劇public int headQueue() {if (isEmpty()) {//為空就拋出異常,我們這里結(jié)束方法使用拋出異常方式throw new RuntimeException("隊(duì)列空,沒(méi)有數(shù)據(jù)~~~");}//顯示是front指針當(dāng)前指的哪位數(shù)據(jù),因?yàn)榧偃邕€沒(méi)有從列隊(duì)中取出數(shù)據(jù),那么當(dāng)前就指向索引為0的位子,故為front+1 為0//若已經(jīng)取了索引為0的數(shù)據(jù),那么當(dāng)前指的就是索引為1的位子,故front+1 為1//若數(shù)據(jù)已經(jīng)取完,那么就判斷直接拋出異常不會(huì)到這一步,假設(shè)到了這一步,也會(huì)索引越界異常return arr[front + 1];}}若看不懂,將代碼拷貝到idea中DEBUG看數(shù)據(jù)變化自然會(huì)懂
上面是線性的隊(duì)列,不能循環(huán)復(fù)用其中的排隊(duì)邏輯,當(dāng)隊(duì)列滿后,第一個(gè)走后,后來(lái)的不能加入子第一個(gè)位置,所以沒(méi)有達(dá)到復(fù)用效果
使用一些取模的方式達(dá)到讓線性的隊(duì)列轉(zhuǎn)換成環(huán)形隊(duì)列,從而實(shí)現(xiàn)先進(jìn)先出,后進(jìn)后出,循環(huán)環(huán)形隊(duì)列
數(shù)組模擬環(huán)形隊(duì)列
上述到達(dá)尾部又向前存儲(chǔ)的隊(duì)列稱為循環(huán)隊(duì)列,為了避免"假溢出",我們通常采用循環(huán)隊(duì)列。
分析
一 尾索引的下一個(gè)為頭索引時(shí)表示隊(duì)列滿,即將隊(duì)列容量空出一個(gè)作為約定,這個(gè)在做判斷隊(duì)列滿的時(shí)候需要注意 (rear + 1) % maxSize == front 滿]
二 rear == front [空]
代碼實(shí)現(xiàn)環(huán)形隊(duì)列
package com.fs.demo_2020_07_11_queueArray;import java.util.Scanner;/*** 模擬環(huán)形隊(duì)列數(shù)組** 1.頭尾部指針取模重新計(jì)算指針值:(rear/front + 1) % maxSize* 2.隊(duì)列空的判斷邏輯:rear == front* 3.隊(duì)列滿的判斷邏輯:(rear + 1) % maxSize == front* 4.隊(duì)列內(nèi)有效數(shù)據(jù)個(gè)數(shù):(rear - front + maxSize) % maxSize**/ public class CircleQueueArray {public static void main(String[] args) {//測(cè)試一把//創(chuàng)建一個(gè)隊(duì)列SimulationCircleQueueArray queue = new SimulationCircleQueueArray(4);char key = ' '; //接收用戶輸入Scanner scanner = new Scanner(System.in);//boolean loop = true;//輸出一個(gè)菜單while (loop) {/*** 遍歷打印下每次執(zhí)完后數(shù)組中的數(shù)據(jù)*/int[] arr = queue.getArr();System.out.println("-------------------------------------------------");for (int i = 0; i < arr.length; i++) {int i1 = arr[i];System.out.println("arr數(shù)組索引:"+i+"位子當(dāng)前的數(shù)據(jù)為:"+i1+".");}System.out.println("-------------------------------------------------");System.out.println("s(show): 顯示隊(duì)列");System.out.println("e(exit): 退出程序");System.out.println("a(add): 添加數(shù)據(jù)到隊(duì)列");System.out.println("g(get): 從隊(duì)列取出數(shù)據(jù)");System.out.println("h(head): 查看隊(duì)列頭的數(shù)據(jù)");key = scanner.next().charAt(0);//接收一個(gè)字符switch (key) {case 's':queue.showQueue();break;case 'a':System.out.println("輸出一個(gè)數(shù)");int value = scanner.nextInt();queue.addQueue(value);break;case 'g': //取出數(shù)據(jù)try {int res = queue.getQueue();System.out.printf("取出的數(shù)據(jù)是%d\n", res);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'h': //查看隊(duì)列頭的數(shù)據(jù)try {int res = queue.headQueue();System.out.printf("隊(duì)列頭的數(shù)據(jù)是%d\n", res);} catch (Exception e) {// System.out.println(e.getMessage());e.printStackTrace();}break;case 'e': //退出scanner.close();loop = false;break;default:break;}}System.out.println("程序退出~~");} }//創(chuàng)建一個(gè)類(lèi)來(lái)模擬環(huán)形隊(duì)列數(shù)組 class SimulationCircleQueueArray{private int maxSize;//表示數(shù)字的最大容納量private int front;//模擬指針指向頭部數(shù)據(jù),對(duì)于普通的隊(duì)列做了調(diào)整,現(xiàn)在默認(rèn)指向第一個(gè)索引位子,也就是0private int rear;//模擬指針指向尾部數(shù)據(jù),同樣也是默認(rèn)指向第一個(gè)索引的位子,也就是0private int[] arr;//數(shù)組用于存放數(shù)據(jù),模擬隊(duì)列//提供一個(gè)get方法觀察數(shù)組中數(shù)據(jù)的變化public int[] getArr() {return arr;}/*** 創(chuàng)建環(huán)形隊(duì)列數(shù)組的構(gòu)造器** @param arrMaxSize 初始化這個(gè)環(huán)形隊(duì)列數(shù)組的容量*/public SimulationCircleQueueArray(int arrMaxSize) {maxSize = arrMaxSize;arr = new int[maxSize];//初始化數(shù)組的容量front = 0;rear = 0;}//判斷隊(duì)列數(shù)組是否滿了public boolean isFull() {/*判斷隊(duì)列是否滿環(huán)形隊(duì)列,判斷隊(duì)列滿,不僅僅在通過(guò)rear = maxSize -1 來(lái)判斷因?yàn)槭黔h(huán)形,尾部指針會(huì)回到之前的位子,所以通過(guò)取模來(lái)重新計(jì)算指針的值(rear+1)%maxSize == front;假設(shè)隊(duì)列內(nèi)部數(shù)組arr的最大容量為4隊(duì)列添加數(shù)據(jù),rear指針需取模重新計(jì)算指針指向值:rear = (rear + 1) % maxSize,并通過(guò)(rear + 1) % maxSize == front來(lái)判斷隊(duì)列是否已滿1.隊(duì)列添加數(shù)據(jù)10,arr[0]=10,rear重新指向1,(1+1)%4!=0,隊(duì)列未滿2.隊(duì)列添加數(shù)據(jù)20,arr[1]=20,rear重新指向2,(2+1)%4!=0,隊(duì)列未滿3.隊(duì)列添加數(shù)據(jù)30,arr[2]=30,rear重新指向3,(3+1)%4==0,隊(duì)列滿,不能再添加數(shù)據(jù)此時(shí),隊(duì)列內(nèi)所有數(shù)據(jù)為:arr[0]=10,arr[1]=20,arr[2]=30,隊(duì)列有效數(shù)據(jù)個(gè)數(shù):(3-0+4)%4=3*/return (rear+1)%maxSize == front;}//判斷隊(duì)列是否為空public boolean isEmpty() {/*隊(duì)列當(dāng)取得指針和添加的指針一致的時(shí)候,所明去完了,沒(méi)有數(shù)據(jù)*/return rear == front;}//添加數(shù)據(jù)到隊(duì)列public void addQueue(int data) {/*隊(duì)列的添加:一般線性隊(duì)列,尾部指針直接遞增而環(huán)形隊(duì)列,尾部指針可能在次指向索引為0的位子,因此不能單一的通過(guò)遞增來(lái)處理,需要取模重新計(jì)算尾部的指針位置*///添加前先判斷隊(duì)列是否滿了if (isFull()) {System.out.println("隊(duì)列滿,不能加入數(shù)據(jù)~~~");return;}arr[rear] = data;//在尾部指針指向的位子添加傳遞的數(shù)據(jù)//添加值后,尾部指針的走向不能在++遞增來(lái)實(shí)現(xiàn),需要從新取模運(yùn)算rear = (rear + 1)%maxSize;}//獲取隊(duì)列的數(shù)據(jù),出隊(duì)列public int getQueue() {/*環(huán)形列隊(duì)取數(shù)據(jù):和添加數(shù)據(jù)一樣,添加是尾部指針不能一直遞增,需要取模重新計(jì)算尾部指針的位子而頭部指針在每次取出數(shù)據(jù)后也不能一直遞增,需要取模讓指針回到最初的位子*///先判斷隊(duì)列是否為空if (isEmpty()) {//為空就拋出異常,我們這里結(jié)束方法使用拋出異常方式throw new RuntimeException("隊(duì)列空,不能獲取數(shù)據(jù)~~~");}//先獲取到頭部指針指向的索引位子獲取出數(shù)據(jù)int value = arr[front];//對(duì)取模計(jì)算出下一次頭部指針的位子front = (front + 1) % maxSize;//將數(shù)據(jù)返回return value;}/*** 顯示隊(duì)列所有的數(shù)據(jù)*/public void showQueue() {if (isEmpty()) {System.out.println("隊(duì)列為空,無(wú)法顯示隊(duì)列的全部數(shù)據(jù)");return;}// 遍歷數(shù)組// 不能單一的對(duì)角標(biāo)遞增處理,會(huì)出現(xiàn)角標(biāo)越界異常// 應(yīng)對(duì)環(huán)形隊(duì)列內(nèi)部的有效數(shù)據(jù),從頭部數(shù)據(jù)開(kāi)始遍歷依次取出// 有效數(shù)據(jù)的下標(biāo):i % maxSizefor (int i = front; i < front + size(); i++) {System.out.printf("arr[%d] = %d\n", i % maxSize, arr[i % maxSize]);}}/*** 獲取隊(duì)列有效數(shù)據(jù)的個(gè)數(shù)* @return 隊(duì)列有效數(shù)據(jù)的個(gè)數(shù)*/private int size() {return (rear - front + maxSize) % maxSize;}//顯示隊(duì)列的頭數(shù)據(jù),不是取數(shù)據(jù)public int headQueue() {/*獲取列隊(duì)頭部數(shù)據(jù)就是獲取頭部指針指向的位子*/if (isEmpty()) {//為空就拋出異常,我們這里結(jié)束方法使用拋出異常方式throw new RuntimeException("隊(duì)列空,沒(méi)有數(shù)據(jù)~~~");}return arr[front];} }代碼運(yùn)行控制臺(tái)測(cè)試
D:\Java\JDK\java1.8 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:0. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:0. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:0. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) a 輸出一個(gè)數(shù) 10 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:0. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:0. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) a 輸出一個(gè)數(shù) 20 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:0. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) a 輸出一個(gè)數(shù) 30 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) s arr[0] = 10 arr[1] = 20 arr[2] = 30 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) g 取出的數(shù)據(jù)是10 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) s arr[1] = 20 arr[2] = 30 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) g 取出的數(shù)據(jù)是20 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) s arr[2] = 30 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) h 隊(duì)列頭的數(shù)據(jù)是30 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) g 取出的數(shù)據(jù)是30 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) h java.lang.RuntimeException: 隊(duì)列空,沒(méi)有數(shù)據(jù)~~~at com.fs.demo_2020_07_11_queueArray.SimulationCircleQueueArray.headQueue(CircleQueueArray.java:203)at com.fs.demo_2020_07_11_queueArray.CircleQueueArray.main(CircleQueueArray.java:60) ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) s 隊(duì)列為空,無(wú)法顯示隊(duì)列的全部數(shù)據(jù) ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:0. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) a 輸出一個(gè)數(shù) 40 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:10. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:40. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) a 輸出一個(gè)數(shù) 50 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:50. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:20. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:40. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù) a 輸出一個(gè)數(shù) 60 ------------------------------------------------- arr數(shù)組索引:0位子當(dāng)前的數(shù)據(jù)為:50. arr數(shù)組索引:1位子當(dāng)前的數(shù)據(jù)為:60. arr數(shù)組索引:2位子當(dāng)前的數(shù)據(jù)為:30. arr數(shù)組索引:3位子當(dāng)前的數(shù)據(jù)為:40. ------------------------------------------------- s(show): 顯示隊(duì)列 e(exit): 退出程序 a(add): 添加數(shù)據(jù)到隊(duì)列 g(get): 從隊(duì)列取出數(shù)據(jù) h(head): 查看隊(duì)列頭的數(shù)據(jù)環(huán)形隊(duì)列的解釋
下面解釋來(lái)源于網(wǎng)絡(luò)收集
作者:rainchxy
鏈接:https://www.jianshu.com/p/9ba8a65464dd
來(lái)源:簡(jiǎn)書(shū)
為什么要%Maxsize呢?
主要是為了處理臨界狀態(tài),即Q.rear向后移動(dòng)一個(gè)位置Q.rear+1后,很有可能超出了數(shù)組的下標(biāo),這時(shí)它的下一個(gè)位置其實(shí)是0,如果將一維數(shù)組畫(huà)成環(huán)形圖,如圖所示:
上圖中最大空間Maxsize,當(dāng)Q.rear=Maxsize-1時(shí),(Q.rear+1)%Maxsize=0,而且Q.front=0,正好滿足隊(duì)滿的條件:(Q.rear+1) %Maxsize= Q.front,此時(shí)為隊(duì)滿。
因此無(wú)論是front還是rear向后移動(dòng)一個(gè)位置時(shí),都要加1與最大空間Maxsize取模運(yùn)算,處理臨界問(wèn)題。
總結(jié):
隊(duì)空:Q.front=Q.rear; // Q.rear和Q.front指向同一個(gè)位置
隊(duì)滿: (Q.rear+1) %Maxsize=Q.front; // Q.rear向后移一位正好是Q.front
入隊(duì):
Q.base[Q.rear]=x; //將元素放入Q.rear所指空間,
Q.rear =( Q.rear+1) %Maxsize; // Q.rear向后移一位
出隊(duì):
e= Q.base[Q.front]; //用變量記錄Q.front所指元素,
Q.front=(Q.front+1) %Maxsize // Q. front向后移一位
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的队列与环形队列使用数组模拟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浅谈:稀疏数组与二维数组之间的转换
- 下一篇: 浅谈:数据结构之单链表,java代码演示