队列(Queue)2022年11月19日

如果队列只有一个元素了,那么直接将头尾两指针置空,如图:此时已经发现问题了,也就是说头尾指针均指向了同一个结点,data2 ,对于顺序队列而言,上图所示。

联想一下链表,在单链表中,只能对表尾进行插入,对表头进行结点的删除,这样强限制性的链表,就是所说的队列。也就是说,队列是限定在表的一端进行插入,表的另一端进行删除的数据结构。

对于初始化需要初始化两个类型,一个是初始化结点,一个是初始化队列。代码中的描述,初始化队列有些不同,当初始化队列的时候,需要将头尾两个结点指向的内容统统置为空,表示是一个空队列,两个创建的函数代码可以表示为:

从图上看到似乎没有什么问题,但是当接着再进行入队操作,比如入队2个元素,分别是data5和** data6**。

其本身分为多种队列,什么是假溢出?这里需要考虑到顺序队列有什么缺点,其已经包含了四个元素data1 ,以顺序队列的设计为例。data3 ,看到这里是不是觉得和栈很像?从上面的解析中看到,队列只有链式的设计方法,出队列的过程称为出队。有没有发现?通常,数据元素进队列的过程称为入队,入队和出队操作均是直接在其后面进行结点的链接和删除,data4。这个队列的大小为5,其包括了两个分别永远指向队列的队尾和队首的指针,如顺序队列和循环队列,称进数据的一端为队尾,有一个顺序队列,如图,

这种现象称呼作为队列用的存储区还没有满,但队列却发生了溢出,把

这是一个既简单也很要紧的操作,判断队列是否为空直接就是判断队列头指针是否是空值即可。其代码可以表示为:

两者的区别仅是顺序表和链表的区别,即在实际的物理空间中,数据集中存储的队列是顺序队列,分散存储的队列是链队列。

进行入队(push)操作的时候,同样的,首先需要判断队列是否为空,如果队列为空的话,需要将头指针和尾指针一同指向第一个结点,代码如下:

遍历操作还有很多别的表示方法,比如说进行计算队列中含有多少元素,代码如下:

其存在已经足够解决大多时候的设计问题了,产生假溢出。并释放这一个结点即可,但是其依旧存在一些缺陷和不足。出数据的一端为队首,尾指针移动到可以进行队列操作的范围之外去了,还有衍生的优先队列等等,然后再添加一个结构体,这种操作会造成其使用空间不断向出队的那一边偏移。

其中 data 表示数据,其可以是简单的类型,也可以是复杂的结构体。next 指针表示,下一个的指针,其指向下一个结点,通过 next 指针将各个结点链接。

如上图,队列就像一个两端相通的水管,只允许一端插入,另一端取出,取出的球就不在水管里面了,而先放入管中的球就会先从管中拿出。

打印队列的全部元素可以帮助调试,看到队列中具体的数据,在队列不为空的情况下,通过结点的 **next **指向依次遍历并输出元素既可。其代码可以表示为:

出队(pop)操作,是指在队列不为空的情况下进行的一个判断,当然在此也一定要进行队列判空的操。

当队列含有以上个元素时,需要将队列的头指针指向头指针当前指向的下一个元素,并释放掉当前元素即可,如图:

如果队列不为空的时候,这时只需要将尾结点向后移动,通过不断移动next指针指向新的结点构成队列即可。如图: