队列基本概念
- 队列是一个有序列表,可以用数组或是链表来实现。
- 遵循先入先出的原则
数组模拟循环队列
- maxSize :队列容量
- front:队列头下标(第一个元素的下标,初始为0)
- rear:队列尾下标(最后一个元素的后一个位置下标,初始为0)
- 队列满:(rear + 1)%maxSize == front
- 队列空:rear == front
- 入队列:array[rear] = data;
rear = (rear + 1)%maxSize - 出队列:data = array[front];
front = (rear + 1)%maxSize - 数据个数:count = (rear - front + maxSize)%maxSize
public class CircleArrauQueueDemo {
public static void main(String[] args) {
CircleArrauQueue caq = new CircleArrauQueue(3);
Boolean loop = true;
Scanner sc = new Scanner(System.in);
while(loop){
System.out.println("p(printy):打印队列");
System.out.println("e(exit):退出程序");
System.out.println("a(add):添加数据到队列");
System.out.println("o(off):取出数据");
System.out.println("h(head):查看列头数据");
char key = sc.next().charAt(0);
switch (key) {
case 'p':
try {
caq.printQueue();
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'e':sc.close();
loop = false;
break;
case 'a':
try {
System.out.println("请输入数字");
int value = sc.nextInt();
caq.add(value);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'o':
try {
caq.off();
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
caq.printHead();;
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
default:
break;
}
}
}
}
class CircleArrauQueue{
//队列容量
private int maxSize;
//队列头下标
private int front;
//队列尾下标
private int rear;
//用来存放数据的数组
private int[] array;
//构造方法初始化各成员值
public CircleArrauQueue(int maxsize) {
this.maxSize = maxsize;
front = 0;
rear = 0;
array = new int[maxSize + 1];
}
//判空
public Boolean isEmpty() {
return front == rear;
}
//判满
public Boolean isFull() {
return (rear + 1)%maxSize == front;
}
//入队列
public void add(int data) {
if(this.isFull()) {
throw new RuntimeException("队列已满");
}
array[rear] = data;
rear = (rear+1)%maxSize;
}
//出队列
public int off() {
if(this.isEmpty()) {
throw new RuntimeException("队列空");
}
int num = array[front];
front = (front+1)%maxSize;
return num;
}
//打印队列头
public void printHead() {
if(this.isEmpty()) {
throw new RuntimeException("队列空");
}
System.out.println(array[front]);
}
//打印队列
public void printQueue() {
if(this.isEmpty()) {
throw new RuntimeException("队列空");
}
for(int i = front;i != rear;i = (i + 1)%maxSize) {
System.out.println(array[i] + " ");
}
}
}
测试结果