😽个人主页: tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主
🌈梦的目标:努力学习,向Java进发,拼搏一切,让自己的未来不会有遗憾。
🎁欢迎各位→点赞👍 + 收藏⭐ + 评论📝+关注✨
本章讲解内容:循环队列 的讲解 →栈与队列的讲解
使用编译器:IDEA
一.循环队列概念
在学习循环队列前,我们应该学会队列知识,知识可查看: 队列的知识 。循环队列可以理解为一个圆圈,首尾相连。
解析,top为队头,rear为队尾。
元素进队时,赋值给rear指针的区域,然后rear指针移动到下一区域。
元素出队时,top指针向前移动一位。
二.队满和队空的情况
队空:队列里无元素的情况,也就是还未有元素进队列,又或者元素全部出队。
图一,循环队列中并无元素,当top和rear共同指向时,无元素,为队空。
图二, 同样top和rear指针相遇,可是循环队列中却全有元素。
注:因此为区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。
队满情况:当循环队列中只剩下一个空存储单元时,队列就已经满了。如下图
结论:队列空:front==rear; 队列满:(rear+1)%N==front;
队列元素个数:(rear – front + N)%N N为队列长度、front为头结点、rear为尾结点
三.代码的实现
我们使用数组实现循环队列。
class ArrayQueue1 { private int MaxSize; //数组长度 private int front; //头结点 private int rear; //尾结点 private int[] arr; //创建队列的构造器 public ArrayQueue1(int maxSize) { MaxSize = maxSize; arr = new int[maxSize]; front = 0; rear = 0; } public boolean isFull() { return (rear + 1) % MaxSize == front; } public boolean isEmpty() { return front == rear; } public void addQueue(int n) { //判断队列满 if (isFull()) { System.out.println("队列满,不能加入数据"); return; } arr[rear] = n; rear = (rear + 1) % MaxSize; } // 获取队列的数据 public int getQueue() { if (isEmpty()) { return -1; } // front 指向队列的第一个元素 // front 后移 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.printf("arr[%d]=%d\n", i % MaxSize, arr[i % MaxSize]); } } // 显示队列的头数据,不是取出数据 public int headQueue() { if (isEmpty()) { System.out.println("队列为空"); return; } return arr[front]; } //求出当前队列有效数据 public int size() { return (rear + MaxSize - front) % MaxSize; } }
总结
循环队列很简单,相当于一条队伍围成一个圈。关键在于求队列长度、队列是否满、是否为空时,求算方法不同。