数据结构 - 队列(非环形队列,以及优化成环形队列)
生活随笔
收集整理的這篇文章主要介紹了
数据结构 - 队列(非环形队列,以及优化成环形队列)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1)隊列的定義與實現形式-方式
2)隊列實現思路(非環形,下面進行優化)
3)代碼實現(注意并不是環形)
package DataStructures.queue;import java.util.Scanner;/*** 使用數組模擬隊列*/ public class ArrayQueueDemo {public static void main(String []args){//測試//創建一個隊列ArrayQueue arrayQueue = new ArrayQueue(3);char key = ' '; //接收用戶輸入Scanner scanner = new Scanner(System.in);boolean loop = true;while(loop){System.out.println("s(show):顯示隊列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加數據到隊列");System.out.println("g(get):從隊列取出數據");System.out.println("h(head):查看隊列頭的數據");key = scanner.next().charAt(0); //接收一個字符System.out.println("=========================");switch (key){case 's':arrayQueue.showQueue();break;case 'a':System.out.println("輸入一個數");int value = scanner.nextInt();arrayQueue.addQueue(value);break;case 'g': //取數據try {System.out.println("取出的數是:" + arrayQueue.getQueue());}catch (Exception e){System.out.println(e.getMessage());}break;case 'h':try{System.out.println("隊列頭的數據是:"+arrayQueue.headQueue());}catch (Exception e){System.out.println(e.getMessage());}break;case 'e'://退出scanner.close();loop = false;break;default:break;}}System.out.println("程序退出~~~~~");} }//隊列類 class ArrayQueue{private int maxSize; //數組的最大容量private int front; //隊列頭private int rear; //隊列尾private int[] arr; //用于存放數據的隊列數組//創建隊列構造器public ArrayQueue(int arrMaxSize){maxSize = arrMaxSize;arr = new int[maxSize];front = -1; //指向隊列頭部,分析出front指向隊列頭的前一個位置rear = -1; //指向隊列尾部,指向隊列尾的數據(即就是隊列的最后一個數據)}//判斷隊列是否滿public boolean isFull(){return rear == maxSize - 1;}//判斷隊列是否為空public boolean isEmpty(){return rear == front;}//添加數據public void addQueue(int n){if (isFull()){System.out.println("隊列已滿,不能加入");return;}rear++; //讓rear后移arr[rear] = n;System.out.println("添加成功");}//獲取隊列數據,出隊列public int getQueue(){if (isEmpty()){//通過拋出異常出來throw new RuntimeException("隊列為空,不能取數據");}front ++;return arr[front];}//顯示隊列的所有數據public void showQueue(){//遍歷if (isEmpty()){System.out.println("隊列為空");return;}for (int i = 0; i < maxSize;i++){System.out.println("arr["+i+"] = "+arr[i]);}}//顯示隊列的頭數據public int headQueue(){if (isEmpty()){throw new RuntimeException("隊列為空");}return arr[front+1];} }上面代碼實現完成后運行,會發現添加輸入后取出,取出的位置不能再進行添加了,也就是添加完取出就不能再用了,沒達到復用的效果
4)所以下面進行優化(改進成環形數組,取模來實現)
ps:這里最后有效數據個數,把他啊想象成一個環形,有可能rear在前有可能front在前,括號里加一個maxSize是防止rear在front后面形成負數,然后取模。
package DataStructures.queue;import java.util.Scanner;/*** 使用數組模擬隊列*/public class CircleArrayQueueDemo {public static void main(String []args){//測試//創建一個隊列CircleArrayQueue arrayQueue = new CircleArrayQueue(4);System.out.println("測試數組模擬環形隊列");char key = ' '; //接收用戶輸入Scanner scanner = new Scanner(System.in);boolean loop = true;while(loop){System.out.println("s(show):顯示隊列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加數據到隊列");System.out.println("g(get):從隊列取出數據");System.out.println("h(head):查看隊列頭的數據");key = scanner.next().charAt(0); //接收一個字符System.out.println("=========================");switch (key){case 's':arrayQueue.showQueue();break;case 'a':System.out.println("輸入一個數");int value = scanner.nextInt();arrayQueue.addQueue(value);break;case 'g': //取數據try {System.out.println("取出的數是:" + arrayQueue.getQueue());}catch (Exception e){System.out.println(e.getMessage());}break;case 'h':try{System.out.println("隊列頭的數據是:"+arrayQueue.headQueue());}catch (Exception e){System.out.println(e.getMessage());}break;case 'e'://退出scanner.close();loop = false;break;default:break;}}System.out.println("程序退出~~~~~");} }class CircleArrayQueue{private int maxSize; //數組的最大容量//指向隊列頭部,就指向隊列的第一個元素,// arr[front]就是隊列的第一個元素,front初值為0private int front;private int rear; //隊列尾private int[] arr; //用于存放數據的隊列數組//創建隊列構造器public CircleArrayQueue(int arrMaxSize){maxSize = arrMaxSize; //表示數組最大容量arr = new int[maxSize];front = 0;rear = 0; //指向隊列尾部,指向隊列尾的數據(即就是隊列的最后一個數據)}//判斷隊列是否滿public boolean isFull(){return (rear+1)%maxSize == front;}//判斷隊列是否為空public boolean isEmpty(){return rear == front;}//添加數據public void addQueue(int n){//是否為空if (isFull()){System.out.println("隊列已滿,不能加入");return;}//直接將數據加入arr[rear] = n;//將rear后移,這里必須考慮取模rear = (rear+1) % maxSize;System.out.println("添加成功");}//獲取隊列數據,出隊列public int getQueue(){//是否為空if (isEmpty()){//通過拋出異常出來throw new RuntimeException("隊列為空,不能取數據");}//這里需要分析出front是指向隊列的第一個元素// 1.先把front對應的值保存到臨時變量// 2.將front 后移// 3.返回臨時變量int value = arr[front];front = (front+1) % maxSize;return value;}//顯示隊列的所有數據public void showQueue(){if (isEmpty()){System.out.println("隊列為空");return;}//遍歷,從front開始變量,遍歷多少個元素for (int i = front; i < front + size();i++){System.out.println("arr["+ i%maxSize +"] = "+arr[i%maxSize]);}}//求出當前隊列有效數據的個數public int size(){return (rear + maxSize - front) % maxSize;}//顯示隊列的頭數據public int headQueue(){if (isEmpty()){throw new RuntimeException("隊列為空");}return arr[front];} }總結
以上是生活随笔為你收集整理的数据结构 - 队列(非环形队列,以及优化成环形队列)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李想:价格贵了10万的理想L9不愁卖
- 下一篇: 【情人节表白代码】——情人节将至,10余