实现思路
1,调整front指向队列的第一个元素,front初始值=0
2,调整rear指向队列的最后一个元素的后一个位置,希望空出一个空间作为约定,rear的初始值=0
3,队满,条件: (rear+1) % maxSize = front ,则队满,队列最多可存 maxSize-1个数
4,队空,条件:rear == front空
5,队列中有效的数据的个数 (rear-front+maxSize) % maxSize
代码实现
package com.datastack.datastack.queue; import java.util.Scanner; /* * 环形队列(数组实现) */ public class CircleQueue { private int maxSize;//队列最大值 private int front;//队首,指向队列首的前一个位置 private int rear;//队尾,指向队列尾的序号 private int[] arr;//存放队列数据的数组 /** * 创建队列 * @param maxSize */ public CircleQueue(int maxSize){ this.maxSize = maxSize; this.arr = new int[maxSize]; this.front = 0; this.rear = 0; } /** * 判断队列是否已满 * @return */ public boolean isFull(){ return (rear+1) % maxSize == front; } /** * 判断队列是否为空 * @param args */ public boolean isEmpty(){ return rear == front; } /** * 添加数据到队列 * @param args */ public void addQueue(int n){ //判断队列是否满 if(isFull()){ System.out.println("队列已满,不能加入数据。"); return; } //直接将数据加入 arr[rear] = n; //将rear后移,需考虑取模 rear = (rear+1) % maxSize; } /** * 出队列 * @param args */ public int getQueue(){ //判断队列是否为空 if(isEmpty()){ //通过抛出异常 throw new RuntimeException("队列空,不能取数据"); } //需要分析front是指向队列的第一个元素 //1,先把front的值保存到变量 //2,将front后移,去摸 int res = this.arr[front]; front = (front+1) % maxSize; return res; } /** * 显示队列数据 * @param args */ public void showQueque(){ if(isEmpty()){ System.out.println("队列为空。"); return; } //从front开始遍历 for(int i=front;i<front+size();i++){ System.out.printf("arr[%d]=%d\t",i % maxSize,arr[i % maxSize]); } } /** * 求出当前队列有效个数 */ public int size(){ return (rear-front+maxSize) % maxSize; } /** * 显示队头 * @param args */ public int headQueue(){ if(isEmpty()){ throw new RuntimeException("队列为空。"); } return this.arr[front]; } public static void main(String[] args) { //创建一个队列 CircleQueue arrQueue = new CircleQueue(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); switch (key) { case 's'://显示队列值 arrQueue.showQueque(); break; case 'a'://入队 System.out.println("请输入一个数"); int value = scanner.nextInt(); arrQueue.addQueue(value); break; case 'g'://出队 try { int res = arrQueue.getQueue(); System.out.println(res); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 'h'://打印对首 try { int res = arrQueue.headQueue(); System.out.println(res); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 'e'://退出程序 scanner.close(); loop = false; break; default: break; } } System.out.println("程序退出"); } }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。