队列,进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
队列特点:先进先出
队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明
队列分为:
①、单向队列(Queue):只能在一端插入数据,另一端删除数据。
②、双向队列(Deque):每一端都可以进行插入数据和删除数据操作。
③、优先级队列(Priority):优先级队列是比栈和队列更专用的数据结构,在优先级队列中,数据项按照关键字进行排序,关键字最小(或者最大)的数据项往往在队列的最前面,而数据项在插入的时候都会插入到合适的位置以确保队列的有序。
在实现之前,我们先看下面几个问题:
①、与栈不同的是,队列中的数据不总是从数组的0下标开始的,移除一些队头front的数据后,队
头指针会指向一个较高的下标位置,如下图:
②、我们再设计时,队列中新增一个数据时,队尾的指针rear 会向上移动,也就是向下标大的方
向。移除数据项时,队头指针 front 向上移动。
总结:因为队列的是输出、输入是分别从前后端来处理,因此需要两个变量front(队头指针)、rear(队尾指针)分别记录队列前后端的下标,front会随着数据输出而改变,而rear则是随着数据输入而改变。maxSize是队列的最大容量。
1.数组实现简单的单向队列(非循环):
当我们将数据存入队列时称为addQueue,addQueue的处理需要有两个步骤。
1)将尾指针往后移:rear+1(因为是顺序存储结构,地址是连续的,所以这两个指针可以直接用int型,所以直接+1),当front==rear表示空队列。
2)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据。rear == maxSize-1表示队满。
注意,rear是指向队列最后元素(包含),而front指向队列最前元素(不包含)
public class Queue { // 用数组模拟一个单向肺循环队列 private int maxSize; // 数组最大容量 private int front; // 队头指针 private int rear; // 队尾