队列
(本人初学者哈 😊)
- 队列是一个有序数组,可以用数组或链表实现
- 遵循先入先出的原则,即:先存入队列的数据要先取出,后存入的要后取出
环形队列
实现模拟队列的数组能够复用
front为第一个数据的值,rear指向最后一个数据后一个位置
// 设置环形队列
public class TestCircleQueue {
public static void main(String[] args) {
// 创建队列
CircleQueue queue = new CircleQueue(4);
char key=' '; // 接收用户输入
Scanner scanner = new Scanner(System.in);
boolean loop = true;
// 输出一个菜单
while (loop){
System.out.print("s:显示队列\t");
System.out.println("e:退出");
System.out.print("a:添加数据到队列\t");
System.out.print("h:队列头数据\t");
System.out.println("g:从队列中取出数据"); // 先进先出
key = scanner.next().charAt(0);
switch (key){
case 's':
queue.show();
break;
case 'a':
System.out.println("请输入一个数");
int value = scanner.nextInt();
try {
queue.add(value);
} catch (Exception e){
e.printStackTrace();
}
break;
case 'g':
System.out.println("从队列头部取出数据");
try{
int res = queue.get();
}catch (Exception e){
e.printStackTrace();
}
break;
case 'h':
System.out.print("队列头部数据: ");
try{
int head = queue.headData();
System.out.println(head);
}catch (Exception e){
e.printStackTrace();
}
break;
case 'e':
loop=false;
break;
}
}
}
}
class CircleQueue{
private int front; // 指向队列头
private int rear; // 指向队列尾部位置的下一个,当队列满的时候,队列第一个数据和最后一个之间有一个空的位置
private int maxsize;
private int[] arr;
public CircleQueue(int maxsize){
this.maxsize = maxsize;
arr = new int[this.maxsize];
}
// 队列是否为空
public boolean isEmpty(){
return front == rear;
}
// 判断是否满
public boolean isFull(){
return (rear+1) % maxsize == front;
}
// 添加数据
public void add(int value){
if (isFull()){
throw new RuntimeException("the queue is full!");
}
arr[rear] = value;
rear = (rear+1) % maxsize;
}
// 取出数据
public int get(){
if (isEmpty()){
throw new RuntimeException("the queue is full!");
}
int temp = arr[front];
front = (front+1) % maxsize;
return temp;
}
// 存有多少数据
public int size(){
return (rear + maxsize - front) % maxsize;
}
// 显示数据
public void show(){
if (isEmpty()){
System.out.println("队列空");
return;
}
System.out.print("[");
for (int i = front; i < front + size(); i++){
System.out.print(arr[i%maxsize] + " ");
}
System.out.println("]");
}
// 头数据
public int headData(){
return arr[front];
}
}