循环队列讲解,以及Java实现代码
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
个人主页 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;
}
}
总结
循环队列很简单相当于一条队伍围成一个圈。关键在于求队列长度、队列是否满、是否为空时求算方法不同。