队列
- 概念:队列是一个有序列表,可以用数组或者链表进行实现
遵循先入先出的原则 - 用数组模拟队列:用数组模拟时需要定义maxSize该队列的最大容量,队列的输出输入分别从前后端进行处理,因此需要定义 front 和 rear 变量就队列前后端下标,front随着数据的输出而改变 rear随着数据的输入而改变
- 原理图如下
注意:在向队列添加数据时需要判断队列是否已满 在获取数据时需要判断队列是否为空
直接用数组模拟队列
- 直接使用数组模拟队列时:front表示队列第一个元素的前一个位置 front =-1,rear表示队列的最后一个元素位置rear=-1 判断队列是否为满的条件是 rear= =maxSize-1 判断数据是否为空的条件是 front= =rear 并且是一次性的队列,不能循环存储数据
- 使用循环队列:
1、front指向队列的第一个元素,即arr[front] 就表示队列的第一个元素front的初始值front=0;
2、rear指向队列的最后一个元素的后一个位置,剩下一个空间作为一个约定,rear的初始值为0
3、当队列满时,条件是(rear+1)%maxSize=front
4、当队列为空时 rear= = front
5、这样规定下,队列中的有效数据个数(rear+maxSize-front)%maxSize
6、在上面的一次性队列中修改为 环形队列
7、代码实现
//写一个模拟循环队列的类
class CricleQueue{
private int maxSize;//表示队列的最大值
private int front ;//表示队列的第一个元素 初始值为0
private int rear;//表示队列最后元素的后一个位置,初始值为0
private int[] arr;//表示存储的数据
//创建一个构造方法 来初始化数据
public CricleQueue(int maxSize){
this.maxSize=maxSize;
this.arr=new int[maxSize];
this.front=0;
this.rear=0;
}
//判断该队列是否满了
public boolean isFull(){
return (rear+1)%maxSize==front;
}
//判断队列是否为空
public boolean isEmpty(){
return rear==front;
}
//向队列中添加元素
public void addQueue(int num){
//判断队列是否为满
if(isFull()){
System.out.println("队列已经满了~");
return;
}
arr[rear]=num;
rear=(rear+1)%maxSize;//取余用来将rear 后移
}
//获取队列中的数据
public int getQueue(){
//判断队列是否为空
if(isEmpty()){
//抛出异常
throw new RuntimeException("队列为空~");
}
//由于front指向的是队列的第一个元素
//1、将获取的值存储到临时变
//2、将front后移
//3、将值进行返回
int vale=arr[front];
front=(front+1)%maxSize;
return vale;
}
//显示队列中的元素
public void showQueue(){
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()){
throw new RuntimeException("队列为空~");
}
return arr[front];
}
//计算队列中的元素数量
public int size(){
return (rear+maxSize-front)%maxSize;
}
}
8、测试代码
public class CricleQueueDemo {
public static void main(String[] args) {
//进行测试
//创建一个队列
CricleQueue queue=new CricleQueue(4);
//接收用户输入
char key=' ';
Scanner sc=new Scanner(System.in);
boolean loop=true;
//输出一个菜单
while(loop){
System.out.println("a(add):添加一个元素");
System.out.println("g(get):获取一个元素");
System.out.println("h(head):获取队首元素");
System.out.println("s(show):显示所有的队列中元素");
System.out.println("e(exit):退出程序");
//接收用户输入 单个字符
key=sc.next().charAt(0);
switch (key) {
case 'a':
System.out.println("请输入一个数字:");
queue.addQueue(sc.nextInt());
break;
case 'g':
try {
int vale = queue.getQueue();
System.out.println("取出的数据是: "+vale);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
int value = queue.headQueue();
System.out.println("队首的元素是:" +value);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 's':
queue.showQueue();
break;
case 'e':
loop=false;
System.out.println("程序退出了~");
break;
default:
break;
}
}
}
}