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