目录
一.循环队列概念
二.队满和队空的情况
三.代码的实现
总结
😽个人主页: 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;}
}
总结
循环队列很简单,相当于一条队伍围成一个圈。关键在于求队列长度、队列是否满、是否为空时,求算方法不同。