队列-使用队列实作
伫列即队列
队列是一种先进先出的资料结构,想像您在管子中放入球,最先放入的球在另一端会最先跑出来,在这边介绍如何使用阵列来实作队列。
使用阵列来实作伫列,我们必须保留两个旗标,假设front指向伫列的前端,rear向伫列的后端,我们每次从伫列后端加入一个资料,rear就加1指向最后一个资料,每次从伫列前端取出一个资料,front就加1指向伫列的最前端,如下图所示:
这是最简单的伫列实作,但是由于阵列的大小必须先决定,所以这种线性的结构有个问题,front与rear会到达阵列的后端,而这个阵列就不能再使用了, 为了解决这个问题,将阵列当作环状来使用,当front或rear到达阵列后端时,就重新从阵列前端再循环,也就是形成环状伫列,如下图所示:
不过阵列的容量还是受限制,所以这个阵列还是会满的,当front = rear时,伫列就满了;伫列的基本操作有五项:新增伫列、加入资料、显示前端资料、取出前端资料、显示所有的伫列元素。
|
|
您如果仔细演算过上面的环状伫列,您会发现有一个空间会被浪费掉,这是因为判断伫列已满或已空的条件都是front = rear,浪费一个空间对现在的电脑记忆体如此足够来说,并不是个大问题,如果您一定要解决这个问题,可以多使用一个flag来判断,如果flag设定为 1且front = rear,则表示伫列已满,如果flag设定为0则front = rear,则表示伫列已空,这样就不会浪费一个伫列空间了,提供改良后的虚拟码如下:
Procedure add(queue, n, front, rear, flag, data)
if(front = rear and flag = 1)
then call QUEUE_FULL
queue(rear) <- data
if(front = rear)
then flag <- 1
end add
Procedure del(queue, n, front, rear, flag, data)
if(front = rear and flag = 0)
then call QUEUE_EMPTY
front <- (front+1) mod n
if(front = rear)
then flag <- 1
end del