环形实现
package com.wang;
import java.util.Scanner;
public class CircleArrQ {
public static void main(String[] args) {
//这里的有效空间只有3
Arrq arrq = new Arrq(4);
char key=' ';
Scanner scanner = new Scanner(System.in);
boolean loop=true;
System.out.println("s:显示队列,a:添加数据,g:取出数据,h:显示头数据,e:退出");
while(loop) {
System.out.print("请选择你要进行的操作:");
key=scanner.next().charAt(0);
switch(key) {
case 's':
arrq.showQ();
break;
case 'a':
System.out.print("请输入要添加的数据:");
int n=scanner.nextInt();
arrq.addQ(n);
break;
case 'g':
System.out.println(arrq.getQ());
break;
case 'h':
System.out.println(arrq.headQ());
break;
case 'e':
scanner.close();
loop=false;
break;
default :
System.out.println("选择错误");
}
}
}
}
class Arrq{
//数组的最大容量
private int maxsize;
//指向队列头的位置,初始位置0
private int head;
//指向最后一个数据的后一个,初始位置0
private int bottom;
//存放数据模拟队列
private int[] arr;
/**
* 对队列进行初始化
* 指定大小
*/
public Arrq(int maxsize) {
super();
this.maxsize = maxsize;
arr=new int[maxsize];
}
/**
* 判断队列是否满了
* (bottom+1)%maxsize==head
*/
public boolean isFull() {
return (bottom+1)%maxsize==head;
}
/**
* 判断队列是否为空
* 当队头和队尾相等时
*/
public boolean isEmpty() {
return head == bottom;
}
/**
* 数据入队列
* 先判断是否满
* 因为初始位置是0,所以直接赋值
* 让rear后移,模除考虑下标溢出,实现了重复添加
*/
public void addQ(int n) {
if (isFull()) {
System.out.println("队列已满");
return;
}
arr[bottom]=n;
bottom=(bottom+1)%maxsize;
}
/**
* 数据出队列,先入先出
* 先判断是否空
* 先用一个临时变量存放head的值,head后移,返回临时变量的值
* 模除考虑下标溢出
*/
public int getQ() {
if (isEmpty()) {
//抛出异常
throw new RuntimeException("队列为空,不能取数据");
}
int a=arr[head];
head=(head+1)%maxsize;
return a;
}
/**
* 显示队列的所有数据
*/
public void showQ() {
if (isEmpty()) {
System.out.println("队列为空");
return;
}
for(int i=head;i<head+size(); i++)
System.out.printf("arr[%d]=%d\n",i%maxsize,arr[i%maxsize]);
}
//求出当前数组中有个多少有效值
public int size() {
return (bottom+maxsize-head)%maxsize;
}
/**
* 显示队列的头数据
*/
public int headQ() {
if (isEmpty()) {
//抛出异常
throw new RuntimeException("队列为空");
}
return arr[head];
}
}