一.概念
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。通俗来讲队列的特点是,先进先出。
类似于现实中的排队买票,先来的先买票,后来的后买票,不能插队。
通过概念可以总结出:
- 队列是有序列表,可以用数组,链表实现(本文使用数组实现)
- 遵循先进先出的规则,先存入的先取出,后存入的后取出
二.数组模拟队列
变量名:
queue[]:队列
maxSize:最大容量
front:首指针,指向第一个元素前一个空间,初始值=-1
rear:尾指针,指向最后一个元素,初始值=-1
1.队列操作
1.1入队列(addQueue)
- 首先判断,队列是否已满,rear = maxSize,如果已满,则退出
- 判断后,尾指针后移,rear++ ,再对数组赋值,queue[rear]
1.2出队列(getQueue)
- 首先判断队列是否为空,front=rear,如果队列为空,无法继续添加,退出
- 判断完成后,front++
2.代码实现
import java.util.Scanner;
/**
* 数组实现队列
*/
public class ArrayQueueDemo {
public static void main(String[] args) {
//创建队列对象
ArrayQueue arrayQueue = new ArrayQueue(3);
char key = ' ';//接受用户输入
Scanner scanner = new Scanner(System.in);
boolean loop = true;
//输出一个菜单
while (loop){
System.out.println("s(show): 显示队列");
System.out.println("a(add): 添加数据到队列");
System.out.println("g(get): 从队列取出数据");
System.out.println("h(h): 查看队列头数据");
System.out.println("e(exit): 查看队列头数据");
key = scanner.next().charAt(0);
switch(key){
case 's':
arrayQueue.showQueue();
break;
case 'a':
System.out.println("输入一个数:");
int num = scanner.nextInt();
arrayQueue.addQueue(num);
break;
case 'g':
try {
int value = arrayQueue.getQueue();
System.out.printf("取出的数据是%d\n",value);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h'