性质
先进先出
使用场景
消耗系统,等等。
数据结构
有序列表,用数组或链表来实现。
数组
规则:先进先出.
示意图:
- 图1,空数组.
- 图2,向空数组中传入数据.从队列的尾部存数据.
- 图3,向数组中取数据.从队列的头部取数据.
算法实现
数组
变量
- Queue作为存放队列的数组.
- 定义maxSize作为队列的最大容量。
- front和rear分别记录队列前后端的下标。
- front 随着数据的输入而改变,rear随着数据的输出而改变。
方法
- 创建队列.
- addQueue:rear+1,当front=rear为空。但是当尾指针rear=maxSize-1时,队列满,无法将元素插入队列。
数组优化——环形队列
变量
- front指向队列的第一个元素,初始值为0。
- rear变量指向队列的最后一个元素的后一个位置。因为留一个空间作为约定。初始值为0.
- 队列满:(rear+1)maxSize==front。
- 队列空:rear==front。
- 队列中有效数据的个数:(rear+maxSize-front)%maxSize.
方法
- 注意取模。
- 添加获得数组元素有效数据的个数的方法size().
代码实现
普通队列
package queue;
import java.io.PrintStream;
import java.util.Scanner;
public class ArrayQueuedemo {
public static void main(String[] args) {
//创建一个队列
ArrayQueue queue= new ArrayQueue(3);
char key=' ';//接受用户输入
Scanner sc=new Scanner(System.in);
boolean loop=true;
while (loop){
System.out.println("s(show):显示队列");
System.out.println("e(exit):退出程序");
System.out.println("a(add):添加数据到队列");
System.out.println("g(get):从队列取出数据");
System.out.println("h(head):查看队列头的数据");
key=sc.next().charAt(0);//接受一个字符
switch (key){
case 's':
queue.showQueue();
break;
case 'a':
System.out.println("请输入一个数据:");
int value=sc.nextInt();
queue.addQueue(value);
break;
case 'g':
try {
int res=queue.getQueue();
System.out.printf("取出的数据是:%d",res);
System.out.println();
}
catch (Exception e){
System.out.println