隊列
- 使用場景:銀行叫號排隊系統
- 定義:有序列表,可用數組或鏈表實現
- 特點:先入先出,先存入隊列的數據先取出,後存入的後取出,排隊
- 數組模擬隊列:
maxSize:隊列最大容量
front:隊列頭指針
rear:隊列尾指針
int【】:數組
package com.atguigu.queue;
import java.util.Scanner;
import javax.management.RuntimeErrorException;
public class ArrayQueue {
public static void main(String[] args) {
ArrayQueue queue = new ArrayQueue(4);
char key = ' ';
Scanner scanner = new Scanner(System.in);
boolean loop = true;
while(loop){
System.out.println("---------------------------------------------------");
System.out.println("a-->入隊");
System.out.println("g-->出隊");
System.out.println("s-->查看數組狀態");
System.out.println("q-->查看隊列狀態");
System.out.println("h-->查看隊列頭部數據");
System.out.println("e-->退出程序");
System.out.println("---------------------------------------------------");
key = scanner.next().charAt(0);
switch (key) {
case 'a':
System.out.println("請輸入一個數字:");
int value = scanner.nextInt();
queue.addValue(value);
break;
case 'g':
try {
int res = queue.getValue();
System.out.printf("出隊的數據爲%d\n", res);
} catch (Exception e) {
System.out.printf(e.getMessage());
}
break;
case 's':
queue.showArray();
break;
case 'q':
queue.showQueue();
break;
case 'h':
queue.headValue();
break;
case 'e':
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序已退出~~~");
}
public int max_size;//隊列最大容量
public int front;//隊列頭位置:初始化後,指向隊列第一個元素之前的位置
public int rear;//隊列尾位置:初始化後,指向隊列最後一個元素的位置
public int[] arr;//存放隊列的數組
// 初始化隊列
public ArrayQueue(int maxSize){
max_size = maxSize;
front = -1;
rear = -1;
arr = new int[max_size];
}
// 判斷隊滿
public boolean isFull(){
if(front == max_size-1){
return true;
}
return false;
}
// 判斷隊空
public boolean isEmpty(){
if(rear == front){
return true;
}
return false;
}
// 入隊
public void addValue(int value){
// 判斷隊滿:若滿,則不可添加
if(isFull()){
System.out.println("隊列已滿,不可添加數據!");
return;
}
front++;
arr[front] = value;
}
// 出隊
public int getValue(){
// 判斷隊空:若空,則不可出隊
if(isEmpty()){
throw new RuntimeException("隊列爲空,不可出隊");
}
rear++;
return arr[rear];
}
// 顯示數組
public void showArray(){
System.out.println("當前數組狀態如下:");
for(int i = 0;i<arr.length;i++){
System.out.printf("arr[%d]-->%d\n", i, arr[i]);
}
}
// 查看隊列頭元素值
public void showQueue(){
System.out.println("當前隊列狀態如下:");
for(int i = rear+1;i<front+1;i++){
System.out.printf("queue[%d]-->%d\n", i, arr[i]);
}
}
public void headValue(){
System.out.printf("頭部數據爲:%d", arr[rear+1]);
}
}
存在問題:
數組只能使用一次,用過的位置不可複用。