基本概念:
栈: 栈仅在表尾进行插入或删除的线性表,又称后进先出线性表。注意栈空或栈满的判断。
栈顶指针存在两种情况,需自行判断:
1、top指针指向栈顶元素的位置
2、top指针指向栈顶元素的上一个位置
队列:队列只允许在一端插入,另一端删除,又称先进先出线性表。在修改队头或队尾指针都要进行对MAXQSIZE求模。
循环队列通常由两个指针来辅助构建:
- 队尾指针(rear):指向队尾元素的下一个位置,也就是即将插入新元素的位置。
- 队头指针(front):指向队头元素的位置。
开始队头指针和队尾指针等于0(表示队列为空),增加元素头指针尾指针加1,删除元素头指针加
针对假溢出的办法:
1、少用一个元素空间。队空的条件:Q.front == Q.rear ; 队满的条件:(Q.rear + 1) % len == Q.front; (len是队列的长度)
相同点:
栈和队列有两种存储:顺序存储和链式存储。
栈和队列的逻辑结构相同:线性结构。(和线性表一样,数据元素之间存在一对一的关系)
练习:
7. (单选题, 2.5分)用链接方式存储的队列,在进行删除运算时
- A. 仅修改头指针
- B. 仅修改尾指针
- C. 头、尾指针都要修改
- D. 头、尾指针可能都要修改
- 当未设头结点时,删除最后一个元素,需要修改头 、尾指针。
19. (单选题, 2.5分)已知循环队列存储在一维数组A[0…n-1]中,且队列非空时front和rear分别指向队头元素和队尾元素。若初始时队列为空,且要求第一个进入队列的元素存储在A[0]处,则初始时front和rear的值分别是
- A. 0,0
- B. 0,n-1
- C. n-1,0
- D. n-1,n-1
解析:因为该题front和rear指向的是元素,第一个进队存储在A【0】,所以front指向0,当添加元素时,rear要先加1,所以rear指向n-1。
21. (单选题, 2.5分)循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置,假设队列两端均可进行入队和出队操作,队列中最多可容纳M-1个元素,初始为空。下列判断队满和队空的条件正确的是
- A. 队空:end1==end2;队满:end1==(end2+1)modM
- B. 队空:end1==end2;队满:end2==(end1+1)mod(M-1)
- C. 队空:end2==(end1+1)mod M;队满:end1==(end2+1)modM
- D. 队空:end1==(end2+1)mod M;队满:end2==(end1+1)mod(M-1)
22. (单选题, 2.5分)最不适合用做链式队列的链表是
- A. 只带队首指针的非循环双链表
- B. 只带队首指针的循环双链表
- C. 只带队尾指针的循环双链表
- D. 只带队尾指针的循环单链表
解析:非循环双链表是没有作用的,反而增加一些操作。
30. (填空题, 2分)循环队列用数组A[0..m-1]存放其元素值,已知其头尾指针分别是front和rear ,则当前队列的元素个数是_______。
(rear - front + m) % m