.循环队列各个参数的含义
(1)队列初始化时,front和rear值都为零;
(2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置;
(3)当队列为空时,front与rear的值相等,但不一定为零;
假设数组的存数空间为7,此时已经存放1,2,3,4,5,6六个元素了,如果在往数组中添加一个元素,则rear=front;此时,队列满与队列空的判断条件front=rear相同,这样的话我们就不能判断队列到底是空还是满了;
解决这个问题有两个办法:一是增加一个参数,用来记录数组中当前元素的个数;第二个办法是,少用一个存储空间,也就是数组的最后一个存数空间不用,当(rear+1)%maxsiz=front时,队列满;
package com.sun.queue;
import java.util.Scanner;
import javax.management.RuntimeErrorException;
public class CircleArrayQueueArray {
public static void main(String[] args) {
CircleArrayQueue queue=new CircleArrayQueue(3);
char key=' ';
Scanner scanner=new Scanner(System.in);
boolean loop=true;
while(loop)
{
System.out.println("s:显示队列");
System.out.println("e:退出程序");
System.out.println("a:添加数据队列");
System.out.println("g:从队列取出数据");
System.out.println("h:查看队列头的数据");
key=scanner.next().charAt(0);//接收一个字符
switch(key){
case 's':
queue.showQueue();break;
case 'a':
System.out.println("输入一个数");
int value=scanner.nextInt();
queue.addQueue(value);
break;
case 'g':
try {
int res=queue.getQueue();
System.out.println("取出的数据是:"+res);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
case 'h':
try {
int res=queue.headQueue();
System.out.println("队列头的数据为:"+res);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();
loop=false;
break;
default:break;
}
}
}
}
class CircleArrayQueue{
private int maxsize;
private int front;
private int rear;
private int[] arr;
public CircleArrayQueue(int arrsize) {
maxsize=arrsize;
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()){
System.out.println("队列已满");
return;
}
arr[rear]=n;
rear=(rear+1) % maxsize;
}
public int getQueue(){
if(isEmpty()){
System.out.println("队列已满");
}
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("队列是空的");
return ;
}
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 RuntimeErrorException(null, "队列为空,没有数据");
}
return arr[front+1];
}
}