数据结构之数组模拟环形队列(Java实现)
程序员文章站
2022-03-12 23:04:07
...
分析说明:
1) 尾索引的下一个为头索引时表示队列满,即将队列容量空出一个作为约定,这个在做判断队列满的
时候需要注意 (rear + 1) % maxSize == front 满]
2) rear == front [空]
3) 分析示意图:
代码实现
package com.zhenghuan.queue;
/*
front变量:指向队列的第一个元素,即arr[front]为队列的第一个元素,front的初始值为0;
rear变量:指向队列最后一个元素的后一个位置
判断满:(rear+1)%maxsize=front
判断空:rear=front
队列中有效数据的个数:(rear+maxsize-front)%maxsize rear=1 max=0
*/
import java.util.Scanner;
public class CircleArrayAueueDemo {
public static void main(String[] args) {
//测试一把
//创建一个队列
CircleArray arrayQueue=new CircleArray(4);//其队列有效数据最大是3
char key=' ';//接受用户输入
Scanner scanner = new Scanner(System.in);
boolean loop=true;
//输出一个菜单
while (loop){
System.out.println("s(show);显示队列");
System.out.println("e(exit);退出程序");
System.out.println("a(add);添加数据到队列");
System.out.println("g(get);从队列取出数据");
System.out.println("h(head);查看队列头数据");
key=scanner.next().charAt(0);//接受一个字符
switch (key){
case 's':arrayQueue.showQueue();
break;
case 'a':
System.out.println("请输入一个数:");
int value=scanner.nextInt();
arrayQueue.addQueue(value);
break;
case 'g':try {
int res=arrayQueue.getQueue();
System.out.printf("取出的数据是%d\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'h':try {
int res=arrayQueue.headQueue();
System.out.printf("队列头的数据是%d\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'e'://退出
scanner.close();
loop=false;
break;
default:
break;
}
}
System.out.println("程序退出");
}
}
class CircleArray{
private int maxsize;//表示数组最大容量
private int front;
//front变量:指向队列的第一个元素,即arr[front]为队列的第一个元素,
// front的初始值为0;
private int rear;
//rear变量:指向队列最后一个元素的后一个位置
// rear的初始值为0;
private int[] arr;//该数组用于存放数据,模拟队列
public CircleArray(int arrMaxSize){
maxsize=arrMaxSize;
arr=new int[maxsize];
front=0;rear=0;
}
public boolean isFull(){//判断队列是否满了
return (rear+1)%maxsize==front;
}
public boolean isEmpty(){//判断是否为空
return rear==front;
}
public void addQueue(int n){//添加数据
if (isFull())
throw new RuntimeException("环形队列已满,无法加入");
//arr[rear++]=n; 这样不严谨,rear必须取模
arr[rear]=n;
rear=(rear+1)%maxsize;
}
public int getQueue(){
if (isEmpty())
throw new RuntimeException("环形队列为空,无法取出");
/*
这里需要分析出front是指向队列第一个元素
①将front对应值保存到临时变量 ②将front后移 ③返回临时保存的变量
*/
int value=arr[front];
front=(front+1)%maxsize;
return value;
}
public int Size(){//显示当前队列有效数据元素个数
return (rear+maxsize-front)%maxsize;
}
public void showQueue(){
if (isEmpty())
System.out.println("环形队列为空,无法取出");
else {
//从front开始遍历,确定遍历maxsize个元素
for (int i=front;i<front+Size();i++){
System.out.printf("arr[%d]=%d\t",i%maxsize,arr[i%maxsize]);
}
}
}
public int headQueue(){
if (isEmpty())
throw new RuntimeException("环形队列为空,无法取出");
return arr[front];
}
}
上一篇: 数据结构之循环队列(改进版队列)-----重点、难点
下一篇: HTML如何制作表单