队列基础知识

  • 27.循环队列存储在数组A[0…m]中,则入队时的操作为( )。【中山大学 1999 一、6(1分)】

    A. rear=rear+1 B. rear=(rear+1) mod (m-1)

    C. rear=(rear+1) mod m D. rear=(rear+1)mod(m+1)

队列:像栈一样,队列也是一种线性表,它的特性是先进先出,插入在一端,删除在另一端。就像排队一样,刚来的人入队要排在队尾,每次出队的都是队首的人。

队列与栈一样,是一种线性存储结构,它具有如下特点:

  1. 队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。
  2. 在队尾添加元素,在队头删除元素。

队列的顺序存储形式,可以用一段连续的空间存储数据元素,用两个整型变量记录队头和队尾元素的下标。

img

初始化:

img

入队:

(1)将队尾指向的位置赋值,并且赋值后将队尾的位置后移

img

(2)在入队时难免会出现以下情况

img

队列头删尾插,当尾指针到达末尾时就不能在插入元素,但是在队列中还有剩余的空间没有用,队列没有真正的满 ,(头部有元素删除出现空余,尾指针到达末尾)队列的空间未利用完,但是却造成了元素的溢出(又称"假溢出"),所以要利用循环队列,这样就不会有这样的顾虑

循环队列:

循环队列其实就是个数组,是靠队头、队尾、下标来实现头尾相接 如队列A有Maxsize个位置,当到达Maxsize-1时,判断到达队尾了,下标变道队头0,即可回到0——队列头部。

img

解决假溢出的方法:后面的满了,就从头在开始,形成头尾相接的循环,即循环队列。

img

    1. 循环队列通常用指针来实现队列的头尾相接。( )
  • 17.循环队列也存在空间溢出问题。( )

入队操作:入队时将元素放入到rear指向的空间,同时rear指针向后移动一个单位。

rear = (rear + 1) mod Maxsize 也就是对 (rear+1) 取模

因为rear指针会一直增加到比队列容量大的数字,对其取模就是为了使其缩小,指向真正的位置例如 容量大小为5 队尾指向9 取模队尾指向的是4,说明队尾指正已经走过了一个圈

出队操作:

img

将头指针向着元素增长方向移动一个单元,原来的头指针指向的元素并没有真正的删除,只是逻辑上的删除,后序如果要用到这个空间,会用新的元素将其覆盖掉

front = (front + 1)mod Maxsize

取余的原因与入队一致。

  • 28.若用一个大小为6的数组来实现循环队列,且当前rear和front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,rear和front的值分别为多少?( )【浙江大学1999 四、1(4分)】

    A. 1和 5 B. 2和4 C. 4和2 D. 5和1

  • 31.最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是 ( )。

    ​ A. (rear+1) MOD n=front B. rear=front

    ​ C.rear+1=front D. (rear-l) MOD n=front

判断队列是否为空:

img

此时队尾指向的是循环队列的最后一个空间,这个空间并没有存放任何数据,判断队列是否为满只要将队尾指针+1,之后对值取模,看看其是否与队头相等。

例如队列空间大小为10,队尾指向第10个空间,下标为9,对其加1等于10,取模等于0,此时队头也是指向0的所以队满。

如果一开始队头指向的是1,队尾指向的是0,那么队尾加1,取模后为1,那么此时对也满

也就是front = (rear + 1) mod Maxsize

在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素。

循环队列的相关条件和公式:

1.队空条件:rear==front

2.队满条件:(rear+1) %Maxsize==front,其中Maxsize为循环队列的最大长度

3.计算队列长度:(rear-front+Maxsize)%Maxsize

4.入队:(rear+1)%Maxsize

5.出队:(front+1)%Maxsize

  • 25.假设以数组A[m]存放循环队列的元素,其头尾指针分别为front和rear,则当前队列中的元素个数为( )。【北京工商大学 2001 一、2(3分)】

    A.(rear-front+m)%m B.rear-front+1 C.(front-rear+m)%m D.(rear-front)%m

获取队列中的元素个数:

普通队列我们使用 队尾减去对头 就可以得到元素个数 但是循环队列队尾减去对头可能会出现负数,所以需要加上容量大小后取模,这样才会得到真实的容量大小

例如队列大小6,队尾指向1,队头指向2,那么元素个数为(1-2+6)%6=5个

例如队列大小6,队尾指向5,队头指向0,那么元素个数为(5-0+6)%6=5个

    1. 栈和队列的共同点是( )。【燕山大学 2001 一、1(2分)】

    A. 都是先进先出 B. 都是先进后出

    C. 只允许在端点处插入和删除元素 D. 没有共同点

栈又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底,他是先进后出的。

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头,他是先进先出的。


版权声明:本文为MIMANCHI123原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。