普通数组模拟队列
思路:
定义数组容量maxSize;队列头 front; 队列尾:rear; 以及数组 arr[];
初始化front和rear都为-1;
以rear==maxSize-1来判断队列是否已满
以front==rear来判断队列是否为空
具体代码:
package 算法.Queue;import java.util.Scanner;//用数组模拟队列public class ArrayQueueDemo {public static void main(String[] args) {ArrayQueue arrqueue=new ArrayQueue(3);Scanner input=new Scanner(System.in);String n;boolean loop=true;while (loop){System.out.println("s(show):显示所有数据");System.out.println("a(add):向队列中添加一个数据");System.out.println("g(get):取出队列头");System.out.println("h(head):查看队列头");System.out.println("e(exit):退出");n=input.next();switch (n){case "s":arrqueue.showQueue();break;case "a":System.out.println("请输入一个数");int value=input.nextInt();arrqueue.addQueue(value);break;case "g":try {int res=arrqueue.getQueue();System.out.println("取出的数据是:"+res);}catch (Exception e){System.out.println(e.getMessage());}break;case "h":try {int res=arrqueue.headQueue();System.out.println("队列的头数据为:"+res);}catch (Exception e){System.out.println(e.getMessage());}break;case "e":input.close();loop=false;break;default:break;}}System.out.println("程序退出");}}//用数组模拟队列class ArrayQueue{private int maxSize;//表示数组最大容量private int front;//队列头private int rear;//队列尾private int[] arr;//该数组用于存储数据,模拟队列public ArrayQueue(int maxSize) {this.maxSize = maxSize;this.arr=new int[maxSize];this.front = -1;this.rear = -1;}public boolean isEmpty(){//判断队列是否为空return front==rear;}public boolean isFull(){//判断队列是否已满return rear==maxSize-1;}public void addQueue(int value){//向队列中添加一个数据if(isFull()){System.out.println("队列已满");return;}arr[++rear]=value;}public int getQueue(){//取出队列头if(isEmpty()){throw new RuntimeException("队列为空,不能取数据");}return arr[++front];}public void showQueue(){//显示所有数据if(isEmpty()){System.out.println("队列为空,没有数据");return;}for (int i=0;i<arr.length;i++){System.out.println("arr["+i+"]="+arr[i]);}}public int headQueue(){//查看队列头if(isEmpty()){throw new RuntimeException("队列为空,不能无头数据");}return arr[front+1];}}
缺点:
此种方法有很多问题,数组只能利用一次
所以我们一般用循环数组来模拟队列
循环数组模拟队列
思路:
定义数组容量maxSize;队列头 front; 队列尾:rear; 以及数组 arr[];
初始化front和rear都为0;
以front==rear来判断队列是否为空
注意!以(rear+1)%maxSize==front来判断队列是否已满,因为是循环数组
且其数组存储数据的长度为 (rear+maxSize-front)%maxSize
因为需要用maxSize去做一个判断,且我的构造器是这个逻辑,
public CircleArrayQueue(int maxSize) {
this.maxSize = maxSize;
this.arr=new int[this.maxSize];
this.front = 0;
this.rear = 0;
}
所以,我的循环数组只能储存maxSize-1个数据
package 算法.Queue;
import java.util.Scanner;
public class CircleArrayQueueDemo {//用循环数组模拟队列
public static void main(String[] args) {
CircleArrayQueue circlequeue=new CircleArrayQueue(4);
Scanner input=new Scanner(System.in);
String n;
boolean loop=true;
while (loop){
System.out.println("s(show):显示所有数据");
System.out.println("a(add):向队列中添加一个数据");
System.out.println("g(get):取出队列头");
System.out.println("h(head):查看队列头");
System.out.println("e(exit):退出");
n=input.next();
switch (n){
case "s":
circlequeue.showQueue();
break;
case "a":
System.out.println("请输入一个数");
int value=input.nextInt();
circlequeue.addQueue(value);
break;
case "g":
try {
int res=circlequeue.getQueue();
System.out.println("取出的数据是:"+res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case "h":
try {
int res=circlequeue.headQueue();
System.out.println("队列的头数据为:"+res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case "e":
input.close();
loop=false;
break;
default:
break;
}
}
System.out.println("程序退出");
}
}
class CircleArrayQueue{//用数组模拟队列
private int maxSize;//表示数组最大容量
private int front;//队列头
private int rear;//队列尾
private int[] arr;//该数组用于存储数据,模拟队列
public CircleArrayQueue(int maxSize) {
this.maxSize = maxSize;
this.arr=new int[this.maxSize];
this.front = 0;
this.rear = 0;
}
public boolean isEmpty(){//判断队列是否为空
return front==rear;
}
public boolean isFull(){//判断队列是否已满
return (rear+1)%maxSize==front;
}
public void addQueue(int value){//向队列中添加一个数据
if(isFull()){
System.out.println("队列已满");
return;
}
arr[rear]=value;
rear=(rear+1)%maxSize;
}
public int getQueue(){//取出队列头
if(isEmpty()){
throw new RuntimeException("队列为空,不能取数据");
}
int value=arr[front];
front=(front+1)%maxSize;
return value;
}
public void showQueue(){//显示所有数据
if(isEmpty()){
System.out.println("队列为空,没有数据");
return;
}
for (int i=front;i<front+queueSize();i++){
System.out.println("arr["+i%maxSize+"]="+arr[i%maxSize]);
}
}
public int headQueue(){//查看队列头
if(isEmpty()){
throw new RuntimeException("队列为空,不能无头数据");
}
return arr[front];
}
public int queueSize(){
return (rear+maxSize-front)%maxSize;
}
}
