队列为一个有序列表,是先进先出的
使用数组来实现环形队列
设计思路:
(1) 首先,创建一个数组,长度为maxSize ,来设置两个节点,一个头节点front指向第一个元素、一个尾节点rear指向最后一个元素的后一个位置,初始化为0
(2) 在添加数据时,需要判断队列是否满;在获取数据时,需要判断队列是否空。 添加数据和获取数据时,分别操纵的是rear,front。
(3) 判断队列满: (rear+1) % maxSize = front
(4) 判断对列空: front == rear
(5) 此时队列中的有效数据为: (rear + maxSize - front) % maxSize`
import java.util.Scanner;
public class ArrayTraQueue {
public static void main(String[] args){
arrayQueue queue = new arrayQueue(4);
Scanner input = new Scanner(System.in);
char key = ' ';
boolean loap = true;
while(loap){
System.out.print("a : 添加数据\n");
System.out.print("g : 获取数据\n");
System.out.print("h : 查看头节点数据\n");
System.out.print("s : 遍历队列数据\n");
System.out.print("e : 退出程序\n");
System.out.printf("请选择操作:");
key = input.next().charAt(0);
switch(key){
case 'a':
Scanner n = new Scanner(System.in);
System.out.print("请输入一个数:");
int sum = n.nextInt();
queue.addQueue(sum);
break;
case 'g':
try{
int num = queue.getQueue();
System.out.println("取到数据为:" + num);
}catch(Exception e){
System.out.println(e.getMessage());
}
break;
case 'h':
int num1 = queue.peekQueue();
System.out.println("当前头节点数据为:" + num1);
break;
case 's':
queue.showQueue();
break;
case 'e':
System.out.println("程序即将退出...");
break;
default :
break;
}
}
System.out.println("程序退出...");
}
}
class arrayQueue{
private int MaxSize;
private int front;
private int rear;
private int[] arr;
public arrayQueue(){
}
public arrayQueue(int maxsize){
MaxSize = maxsize;
front = 0;
rear = 0;
arr = new int[MaxSize];
}
public boolean isEmpty(){
return front == rear;
}
public boolean isFull(){
return (rear+1)%MaxSize == front;
}
public void addQueue(int n){
if (isFull()){
System.out.println("队列已满,不能继续添加!!!");
return;
}
arr[rear] = n;
rear = (rear+1) % MaxSize;
System.out.println("添加成功...");
}
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
int value = arr[front];
front = (front + 1) % MaxSize;
return value;
}
public int peekQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[front];
}
public void showQueue(){
if (isEmpty()){
System.out.printf("队列为空\n");
return;
}
int size = (rear + MaxSize - front) % MaxSize;
for (int i=front; i<(front + size); i++){
System.out.printf("arr[%d]: %d\n", i % MaxSize, arr[i % MaxSize]);
}
}
}