优化:环形队列
使用数组模拟环线队列的思路分析:
- Front变量发含义做一个调整:front就指向队列的第一个元素,也就是说arr[front]就是队列第一个元素front的初始值为0
- Rear变量的含义做一个调整:rear指向队列的最一个元素的后一个位置
- 当队列满时的条件是(rear + 1) % maxSize = front
- 队列为空的条件 rear = front
- 当我们这样分析是,队列中有效的数据的个数为:(rear + maxSize - front) % maxSize//
主类
public static void main(String[] args) throws Exception {
CircleArrayQueue caq = new CircleArrayQueue(6);
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':
caq.showQueue();
break;
case'e':
scanner.close();
loop = false;
break;
case'a':
System.out.println("输入一个数据");
int a = scanner.nextInt();
caq.addQueue(a);
break;
case'g':
try{
int res = caq.getQueue();
System.out.println("取出的数据是" + res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case'h':
try{
int res = caq.showHead();
System.out.println("队列头的数据为" + res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
}
}
System.out.println("程序推出");
}
}
class CircleArrayQueue{
private int maxSize;//最大容量
private int front;//队列头
private int rear;//队列尾
private int[] arr;//该数组存放数据
public CircleArrayQueue(int arrMaxSize){
maxSize = arrMaxSize;
arr = new int[maxSize];
front = 0;
rear = 0;
}
//判断队列是否为满
public boolean isFull(){
return (rear + 1) % maxSize == front;
}
public boolean isNull(){
return rear == front;
}
public void addQueue(int n){
if (isFull()){
System.out.println("队列为满,不能加入数据");
return;
}else{
arr[rear] = n;//添加数据
rear = (rear + 1) % maxSize;//数据后移,取模可以重复使用
}
}
public int getQueue() throws Exception {
if (isNull()){
throw new Exception("队列空,不能取数据");
}
/*取出的步骤:
1.先把front对应的值保留到一个临时变量
2.将front后移
3.讲临时保存的变量返回
*/
else {
int value = arr[front];
System.out.println("取出的数据为:" + value);
front = (front + 1) % maxSize;
return value;
}
}
public void showQueue(){
if (isNull()){
System.out.println("队列为空,不能遍历");
}else{
//从front遍历到front + 有效数据
for (int i = front; i < size();i ++) {
System.out.println("arr" + i % maxSize + ":" + arr[i % maxSize]);
}
}
}
private int size(){
return(rear + maxSize - front) % maxSize;
}
int showHead() throws Exception {
if (isNull()){
throw new Exception("队列为空,不能显示头");
}else{
return arr[front];
}
}