3 队列
概念:一个有序列表,可以使用数组或链表实现
特点:先进先出
3.1使用数组模拟队列:
图中的Queue代表队列,MaxSize代表队列最大容量,rear代表尾部、front代表头部。入队时rear数值(由-1变大)变化,出队时front数值(由-1变大)变化
3.1.1思路分析:
- 当front == rear [空队列],将尾指针往后移:rear+1,数据存入rear所指元素
- 当rea r== maxsize-1【队列满】,队列无法存储数据
3.1.2队列实现代码:
public class ArrayQueue {
private int maxSize; //队列容量
private int front; //队列头部
private int rear;//队列尾部
private int[] arr;//队列数组
//创建队列构造器
public ArrayQueue(int max){
maxSize=max;//指定队列的容量大小
arr=new int[maxSize];
front=-1;//初始状态,头部指向队列(从零开始) 的外面
rear=-1;//初始状态,尾部也指向队列(从零开始) 的外面
}
//判断队列是否以满
public boolean isFull(){
return rear == maxSize-1;
}
//判断队列为空
public boolean isEmpty(){
return front==rear;
}
//显示队列的头数据
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列是空的");
}
return arr[front+1];
//front初始在队列外面,当front加一时,指向了第一个数据 注意:此时front的值是不变的,
}
//入队
public void addQueue(int n){
if (isFull()){
System.out.println("队列满了");
return;
}
rear++; //rear初始在队列外面,当rear加一时,指向了数组的第一个空间
arr[rear]=n;
}
//出队
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列是空的");
}
front++;
return arr[front];
}
//显示队列的所有数据
public void showQueue(){
if (isEmpty()){
System.out.println("队列是空的");
return;
}
for (int i=0;i<arr.length;i++){
System.out.println("arr的数据为:{"+arr[i]+"}");
}
}
}
3.1.3队列操作的小程序:
import java.util.Scanner;
public class ArrayQueueTest {
public static void main(String[] args) {
//创建队列
ArrayQueue queue = new ArrayQueue(3);
//键盘输入数据
Scanner scanner = new Scanner(System.in);
//设计菜单操作队列
boolean loop=true;
while (loop){
System.out.println("h(head):查看队列头部数据");
System.out.println("s(show):显示队列的数据");
System.out.println("a(add):数据入队");
System.out.println("g(get):数据出队");
System.out.println("e(exit):退出菜单");
System.out.printf("输入操作:");
char key=scanner.next().charAt(0);//用于接收用户输入,charAt(0):输入的首字符
switch (key){
case 'h':
try {
int queue1 = queue.headQueue();
System.out.println("队列头部数据:"+queue1);
}catch (Exception e){
System.out.println(e.getMessage());
};break;
case 's':
queue.showQueue();break;
case 'a':
System.out.printf("输入一个数据入队:");
int value=scanner.nextInt();
queue.addQueue(value);break;
case 'g':
try {
int queue1 = queue.getQueue();
System.out.println("数据出队:"+queue1);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();//关闭键盘输入
loop=false;
break;
default:
System.out.println("无效操作");break;
}
}
System.out.println("程序结束");
}
}
3.1.4 问题
数组仅可使用一次
3.1.5 优化
将数组改造成环型队列