队列及队列的应用

一、队列
1.1队列和堆栈都是有序列表,也属于抽象型数据类型(ADT),所有加入与删除的动作都发生在不同的两端,并符合“先进先出”的特性。
1.2我们同样可以使用数组或链表来建立一个队列。堆栈数据结构只需一个top指针指向堆栈顶端,而队列则必须使用front和rear两个指针(也称游标)分别指向队列的前端和末尾。
1.3队列在计算机领域的应用也相当广泛,列如计算机的模拟、CPU的作业调度、外围设备联机并发处理系统的应用与图遍历的广度优先搜索法(BFS)
1.4队列的基本运算:
Create:建立空队列
Add:将新数据加入队列的尾端,返回新队列
Delete:删除队列前端的数据,返回新队列
Front:返回队列前端的值
Empty:若队列为空集合,返回真,否则返回假
二、队列的应用
2.1环形队列
环形队列可以解决无法判断队列是否溢出的问题。环形队列让rear与front两个指针能够永远介于0与n-1之间,也就是当rear=MAXSIZE-1,无法存入数据时,如果仍要存入数据时,只需将rear指向下一位置,即索引值为0处。它仍为Q(0:n-1)的一维数组,同时Q(0)为Q(n-1)的下一个元素,这就可以解决无法判断队列是否溢出的问题。指针front永远以逆时针方向指向队列中第一个元素的前一个未知,rear则指向队列当前的最后位置。初始front和rear均默认为-1,表示为空队列,front=rear也为空队列。
另外,之所以将front指向队列中第一个元素的前一个位置,原因是环形队列为空队列和满队列时,front和rear都会指向同一个地方,如此一来我们便无法利用front是否等于rear这个判别式来判断到底当前是空队列还是满队列。
为解决此问题,仅允许队列最多只能存放n-1项数据,即牺牲最后一个空间,当rear指针的下一个是front位置时,就认定队列已满。
2.2双向队列
双向队列是一种前后两端都可输入或取出数据的有序表。
在双向队列中,我们仍然使用两个指针,分别指向加入端和取出端,只是加入和取出数据时,各指针所扮演的角色不再是固定的加入或取出,而且两边的指针都向队列中间移动,其他部分和一般队列无异。
2.3优先队列
优先队列为一种不必遵守队列特性FIFO(先进先出)的有序线性表,其中的每一个元素都赋予一个优先级(Priority),加入元素时可任意加入,但有最高优先级者则最先输出。
一般在医院中的急诊室,当然以最严重的病患优先诊治,跟进入医院挂号的顺序无关。或者在计算机中CPU的作业调度,优先级调度就是一种按进程优先级“调度算法”进行的调度,这种调度就会使用到优先队列,好比优先级高的用户,就比一般用户拥有较高的权利。

你可能感兴趣的:(java,数据结构)