第3章 栈和队列
一、填空题
1. 线性表、栈和队列都是 线性 结构,可以在线性表的 任何 位置插入和删除元素;对于栈只能在 栈顶 插入和删除元素;对于队列只能在 队尾 插入和 队头 删除元素。
2. 队列 是被限定为只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表。
3. 在具有n个单元的循环队列中,队满时共有 n-1 个元素。
4. 带表头结点的空循环双向链表的长度等于 0 。
二、判断正误
( F )1. 在表结构中最常用的是线性表,栈和队列不太常用。
( T )2. 对于不同的使用者,一个表结构既可以是栈,也可以是队列,也可以是线性表。
( F )3. 栈和队列是一种非线性数据结构。
( T )4. 栈和队列的存储方式既可是顺序方式,也可是链接方式。
( F )5. 队是一种插入与删除操作分别在表的两端进行的线性表,是一种先进后出型结构。
三、单项选择题
( A )1. 判定一个队列Q(最多元素为m)为满队列的条件是
A.Q->front == (Q->rear+1) % m
B.Q->rear - Q->front -1== m
C.Q->front == Q->rear
D.Q->front == Q->rear+1
( D )2.数组Q[n]用来表示一个循环队列,f为当前队列头元素的前一位置,r为队尾元素的位置,假定队列中元素的个数小于n,计算队列中元素的公式为
(A)r-f; (B)(n+f-r)% n;
(C)n+r-f; (D)(n+r-f)% n
3. 设有4个数据元素a1、a2、a3和a4,对他们分别进行栈操作或队操作。在进栈或进队操作时,按a1、a2、a3、a4次序每次进入一个元素。假设栈或队的初始状态都是空。
现要进行的栈操作是进栈两次,出栈一次,再进栈两次,出栈一次;这时,第一次出栈得到的元素是 A a2 ,第二次出栈得到的元素是 B a4 ;类似地,考虑对这四个数据元素进行的队操作是进队两次,出队一次,再进队两次,出队一次;这时,第一次出队得到的元素是 C a1 ,第二次出队得到的元素是 D a2 。经操作后,最后在栈中或队中的元素还有 E 2 个。
供选择的答案: A~D:①a1 ②a2 ③ a3 ④a4 E: ①1 ②2 ③ 3 ④ 0
答:A、B、C、D、E分别为 、 、 、 、
四、简答求解题
1. 说明线性表、栈与队的异同点。
相同点:都是线性结构,都是逻辑结构的概念。都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表,只是对插入删除运算进行限制。
不同点:
运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入和删除运算,因而是后进先出表;
队列是只允许在一端进行插入,另一端进行删除运算,因而是先进先出表;
用途不同,堆栈用于子程调用和保护现场,队列用于多道作业处理、指令寄存及其他运算等等。
2. 设循环队列的容量为40(序号从0到39),现经过一系列的入队和出队运算后,有
① front=11,rear=19; ② front=19,rear=11;问在这两种情况下,循环队列中各有元素多少个?
(r-f+n)%n
8 32
五、算法设计
- 假设一个数组squ[m]存放循环队列的元素。若要使这m个分量都得到利用,则需另一个标志tag,以tag为0或1来区分尾指针和头指针值相同时队列的状态是“空”还是“满”。试编写相应的入队和出队的算法。
- //入队
- int enQueue(SqQueue &Q,int x)
- {
- if(Q.tag==1&&Q.front==Q.rear)
- return 0;
- else
- {
- Q.rear=(Q.rear+1)%MAXSIZE;
- Q.data[Q.rear]=x;
- Q.tag=1;
- return 1;
- }
- }
- //出队
- int DeQueue(SqQueue &Q,int &x)
- {
- if(Q.tag==0&&Q.front==Q.rear)
- return 0;
- else
- {
- Q.front=(Q.front+1)%MAXSIZE;
- x=Q.data[Q.front];
- Q.tag=0;
- return 1;
- }
- }