第二个受限线性表,也就是队列。什么是队列呢?

【知识强化】第三章 栈和队列 3.2 队列

每一个先得到冰激淋的小朋友,永远都是排在队头的那一位。他在拿完冰激淋之后会离开该队伍,最后一个得到冰激淋的小朋友,永远都是队尾的那一个小朋友。随后来要买冰激淋的小朋友也会依次地排在队尾。这就是生活当中一个队列的例子。

【知识强化】第三章 栈和队列 3.2 队列

好,接下来我们来看书中是怎样严格地定义队列的。队列的英文名字叫做Queue,它是只允许在表的一端进行插入,表的另一端进行删除操作的线性表。好,在定义当中,首先队列它一定是一个线性表。第二点是队列的受限操作是在一端进行插入,而另一端进行删除。接下来我们把每一个小朋友都替换成数据元素来画出一个队列。

【知识强化】第三章 栈和队列 3.2 队列

【知识强化】第三章 栈和队列 3.2 队列

这就是一个队列,其中有a1-a66个数据元素。

【知识强化】第三章 栈和队列 3.2 队列

在队列当中我们标有队头和队尾。在这个例子当中,a1就是队头元素,a6则是队尾元素。在队头我们是进行删除操作的位置,而队尾是进行插入操作的位置。

【知识强化】第三章 栈和队列 3.2 队列

我们称删除操作为出队。

【知识强化】第三章 栈和队列 3.2 队列

【知识强化】第三章 栈和队列 3.2 队列

这就是一个出队的操作,我们将a1移出了这个队列。

【知识强化】第三章 栈和队列 3.2 队列

而在队尾的操作也就是插入操作,我们称为入队。我们将一个新的数据元素a7入队。这就是一个入队的例子。

【知识强化】第三章 栈和队列 3.2 队列

【知识强化】第三章 栈和队列 3.2 队列

好,我们发现在队列当中最早进队的数据元素也最早离队,所以队列它有先进先出的特点。

【知识强化】第三章 栈和队列 3.2 队列

好,接下来我们还是来简单地介绍一下有关队列的基本操作。第一个还是初始化操作,初始化一个空的队列Q。它的名字叫做InitQueue,传入参数是一个队列的引用。第二个函数是QueueEmpty,是判断队列是否为空的函数。它传入的参数是我们要判断的队列Q,如果队列为空,返回true,否则,返回false。

【知识强化】第三章 栈和队列 3.2 队列

接下来就是常见的两个操作,一个是入队,一个是出队。先看入队操作,入队操作叫EnQueue,它传入参数是一个队列的引用,第二个是我们要传入的数据元素x。大家要注意的一点是,在入队之前我们先要判断队列Q是否为满,如果Q未满,我们才可以进行入队的操作,将数据元素x插入到队尾。而出队操作我们叫做DeQueue,它的传入参数是一个队列的引用,第二个是保存删除元素的引用x。在出队之前我们也要事先判断队列是否为空,如果它非空,我们才可以进行出队操作,删除队头元素,并用x保存返回。好,这是入队以及出队的操作。

【知识强化】第三章 栈和队列 3.2 队列接下来的这个操作是读队头元素的操作,叫做GetHead。参数表有两个参数,第一个是队列Q,第二个是返回队头元素的引用x。好,在读队头元素之前我们也需要判断队列Q是否为空,只有它非空时,我们才可以读队头元素。

【知识强化】第三章 栈和队列 3.2 队列

最后一个操作也就是销毁操作,叫ClearQueue。它传入的是一个队列的引用,销毁该队列并释放队列的内存空间。好,这就是有关队列的基本操作。在最后我们讲述队列的具体存储结构时,我们再来依次地实现这些操作。好,这就是本节课的全部内容。

【知识强化】第三章 栈和队列 3.2 队列

上节课我们学习了队列的逻辑结构,那么这节课我们就来学习如何用存储结构来实现队列。首先我们来看队列的顺序存储结构。

a'dan'a'da【知识强化】第三章 栈和队列 3.2 队列

在书中,顺序队的定义也就非常简单,采用顺序存储的队列。提到顺序存储大家一定知道,顺序队列一定是存放在一块连续的存储空间上。其次我们来思考一下,如何实现队列的受限操作呢?大家回忆一下,顺序栈我们是利用了一个整型变量也就是pop指针来指示了受限操作的位置,也就是出栈和入栈的位置。那么在顺序队列当中我们也可以用一个指针来指示这样一个位置吗?答案是肯定不可以的,因为大家回忆一下,队列它的逻辑结构是怎样的。队列它的受限操作是在一端进行插入,在一端进行入队,而在另一端进行出队的逻辑结构。那么在顺序队列当中我们是不是需要两个指针来指示队列受限操作的位置啊。一个是入队的位置,一个是出队的位置。

【知识强化】第三章 栈和队列 3.2 队列

所以我们设有两个指针,front和rear。front指示的是入队的

相关文章: