【数据结构考研真题】栈和队列(小题)

解题思路

队列的出队顺序等于栈的出栈顺序,因此本题等价于:已知元素 a,b,c,d,e,f,g 依次进栈,出栈顺序为 b,d,c,f,e,a,g,求栈的最小容量。

我们模拟栈的操作过程,记录栈内元素数量的最大值:

操作步骤 栈内元素(栈底→栈顶) 栈内元素个数 说明
1. 进栈 a [a] 1
2. 进栈 b [a, b] 2
3. 出栈 b [a] 1 出栈序列:b
4. 进栈 c [a, c] 2
5. 进栈 d [a, c, d] 3
6. 出栈 d [a, c] 2 出栈序列:b,d
7. 出栈 c [a] 1 出栈序列:b,d,c
8. 进栈 e [a, e] 2
9. 进栈 f [a, e, f] 3
10. 出栈 f [a, e] 2 出栈序列:b,d,c,f
11. 出栈 e [a] 1 出栈序列:b,d,c,f,e
12. 出栈 a [] 0 出栈序列:b,d,c,f,e,a
13. 进栈 g [g] 1
14. 出栈 g [] 0 出栈序列:b,d,c,f,e,a,g

结论

在整个操作过程中,栈内元素数量的最大值为 3 ,因此栈的容量至少是 3

答案:C. 3

选项 A:d c e b f a

模拟操作:

  1. 进栈 a,b,c,d → 栈:[a,b,c,d]
  2. 退栈 d,c → 出栈:d,c(连续 2 次,合法)
  3. 进栈 e → 栈:[a,b,e]
  4. 退栈 e,b → 出栈:d,c,e,b(连续 2 次,合法)
  5. 进栈 f → 栈:[a,f]
  6. 退栈 f,a → 出栈:d,c,e,b,f,a(连续 2 次,合法)✅ 合法,无连续三次退栈。

选项 B:c b d a e f

模拟操作:

  1. 进栈 a,b,c → 栈:[a,b,c]
  2. 退栈 c,b → 出栈:c,b(连续 2 次,合法)
  3. 进栈 d → 栈:[a,d]
  4. 退栈 d,a → 出栈:c,b,d,a(连续 2 次,合法)
  5. 进栈 e → 栈:[e]
  6. 退栈 e → 出栈:c,b,d,a,e
  7. 进栈 f → 栈:[f]
  8. 退栈 f → 出栈:c,b,d,a,e,f✅ 合法,无连续三次退栈。

选项 C:b c a e f d

模拟操作:

  1. 进栈 a,b → 栈:[a,b]
  2. 退栈 b → 出栈:b
  3. 进栈 c → 栈:[a,c]
  4. 退栈 c,a → 出栈:b,c,a(连续 2 次,合法)
  5. 进栈 e → 栈:[e]
  6. 退栈 e → 出栈:b,c,a,e
  7. 进栈 f → 栈:[f]
  8. 退栈 f → 出栈:b,c,a,e,f
  9. 进栈 d → 栈:[d]
  10. 退栈 d → 出栈:b,c,a,e,f,d✅ 合法,无连续三次退栈。

选项 D:a f e d c b

模拟操作:

  1. 进栈 a → 栈:[a]
  2. 退栈 a → 出栈:a
  3. 进栈 b,c,d,e,f → 栈:[b,c,d,e,f]
  4. 退栈 f,e,d,c,b → 出栈:a,f,e,d,c,b这里出现了 连续 5 次退栈操作,违反了 "不允许连续三次退栈" 的约束。❌ 不合法。

答案: D

选项 A:b a c d e
  1. a 入队 → 队列:[a]
  2. b 从左端入队 → 队列:[b, a]
  3. 出队 b → 序列:b
  4. 出队 a → 序列:b,a
  5. c 入队 → 队列:[c]
  6. 出队 c → 序列:b,a,c
  7. d 入队 → 队列:[d]
  8. 出队 d → 序列:b,a,c,d
  9. e 入队 → 队列:[e]
  10. 出队 e → 序列:b,a,c,d,e✅ 合法

选项 B:d b a c e
  1. a 入队 → [a]
  2. b 左端入队 → [b,a]
  3. c 右端入队 → [b,a,c]
  4. d 左端入队 → [d,b,a,c]
  5. 出队 d → 序列:d
  6. 出队 b → 序列:d,b
  7. 出队 a → 序列:d,b,a
  8. 出队 c → 序列:d,b,a,c
  9. e 入队 → [e]
  10. 出队 e → 序列:d,b,a,c,e✅ 合法

选项 C:d b c a e
  1. a 入队 → [a]
  2. b 左端入队 → [b,a]
  3. c 右端入队 → [b,a,c]
  4. d 左端入队 → [d,b,a,c]
  5. 出队 d → 序列:d
  6. 出队 b → 序列:d,b
  7. 此时队列剩余 [a,c]无法先出队 c 再出队 a (出队只能在左端,ac 左边,必须先出 a)❌ 不合法

选项 D:e c b a d
  1. a 入队 → [a]
  2. b 左端入队 → [b,a]
  3. c 左端入队 → [c,b,a]
  4. d 右端入队 → [c,b,a,d]
  5. e 左端入队 → [e,c,b,a,d]
  6. 依次出队 e,c,b,a,d → 序列:e,c,b,a,d✅ 合法

结论

不可能得到的出队序列是 C

步骤 1:确定 d 出栈前的状态

要让 d 第一个出栈,必须先让 a、b、c、d 依次进栈,此时栈内元素从栈底到栈顶为:a, b, c, d。此时 d 出栈,栈内剩余元素为:a, b, c


步骤 2:分析后续可能的出栈顺序

接下来的出栈元素可以从栈顶(c)或新元素(e)中选择,我们分情况讨论:

  1. 情况 1:接下来出栈 c

    • 栈内剩余a, b,此时可以选择出栈 b 或进栈 e:
      • 子情况 1:出栈 b → 栈内剩a → 可选出栈 a 或进栈 e
        • 序列:d, c, b, a, e
        • 序列:d, c, b, e, a
      • 子情况 2:进栈 e → 栈内剩a, b, e → 只能先出 e,再出 b,再出 a
        • 序列:d, c, e, b, a
  2. 情况 2:接下来进栈 e

    • 栈内剩余a, b, c, e → 必须先出 e,再出 c,再出 b,再出 a
      • 序列:d, e, c, b, a

步骤 3:统计符合条件的序列

符合条件的序列共有:

  1. d, c, b, a, e
  2. d, c, b, e, a
  3. d, c, e, b, a
  4. d, e, c, b, a

4 个序列。

答案:B. 4

条件梳理

  • 循环队列存储在数组A[0...n-1]中。
  • 队列非空时,front指向队头元素,rear指向队尾元素。
  • 初始队列为空,第 1 个入队元素要放在A[0]

入队逻辑推导

循环队列的入队操作规则是:先更新rear,再存放元素,公式为:rear = (rear + 1) % n

要让第 1 个元素入队后落在A[0],代入公式:0 = (rear初始 + 1) % n解得:rear初始 = n-1

同时,队列非空时front指向队头,第 1 个元素在A[0],所以front初始值为0


答案:B. 0, n-1

已知条件

  • 入栈序列:1, 2, 3, ..., n
  • 出栈序列:p₁, p₂, p₃, ..., pₙ,且p₂ = 3

步骤 1:确定p₁的可能值

因为p₂ = 3,说明在3出栈前,1, 2, 3已经依次入栈。此时3是第二个出栈的元素,那么第一个出栈的元素p₁只能是21

  • 情况 1:p₁ = 2 → 入栈顺序:1→2,出栈2,再入栈3,出栈3(即p₂=3)。
  • 情况 2:p₁ = 1 → 入栈顺序:1→2→3,出栈1,再出栈3(即p₂=3)。

步骤 2:分析p₃的可能取值

情况 1:p₁=2p₂=3

此时栈内剩余元素:1,接下来可以选择:

  • 出栈1p₃=1
  • 入栈4后出栈4p₃=4
  • 入栈4,5后出栈5p₃=5
  • ......
  • 入栈4,5,...,n后出栈np₃=n
情况 2:p₁=1p₂=3

此时栈内剩余元素:2,接下来可以选择:

  • 出栈2p₃=2
  • 入栈4后出栈4p₃=4
  • 入栈4,5后出栈5p₃=5
  • ......
  • 入栈4,5,...,n后出栈np₃=n

步骤 3:统计p₃的可能取值

综合两种情况,p₃的可能值为:1,2,4,5,...,n,共 n-1 个。

答案:C. n-1

已知条件

  • 循环队列存储在数组 A[0...M-1] 中。
  • end1 指向队头元素,end2 指向队尾元素的后一个位置。
  • 队列两端均可入队和出队,最多容纳 M-1 个元素。
  • 初始时队列为空。

空队条件分析

初始队列为空时,end1end2 指向同一个位置,因此空队的条件是:end1 == end2


队满条件分析

队列最多容纳 M-1 个元素,需要预留一个空位来区分空队和满队。队满时,end2 的下一个位置(循环意义下)就是 end1,对应的公式为:end1 == (end2 + 1) mod M


答案:A. 队空: end1 == end2; 队满: end1 == (end2 + 1) mod M

步骤 1:模拟列车入轨过程

入轨顺序:8,4,2,5,3,9,1,6,7期望出轨顺序:1,2,3,4,5,6,7,8,9

  1. 8 入轨 → 轨道:[8]
  2. 4 入轨 → 轨道:[8,4]
  3. 2 入轨 → 轨道:[8,4,2]
  4. 5 入轨 → 轨道:[8,4,2,5](此时轨道数已达 4)
  5. 3 入轨 → 轨道:[8,4,2,5,3] → 但 3 需要在 2 之后出,需单独轨道,轨道数仍为 4
  6. 9 入轨 → 轨道:[8,4,2,5,3,9] → 9 可单独轨道,轨道数仍为 4
  7. 1 入轨 → 轨道:[8,4,2,5,3,9,1] → 1 需单独轨道,轨道数仍为 4
  8. 6 入轨 → 6 可接在 5 之后,轨道数不变
  9. 7 入轨 → 7 可接在 6 之后,轨道数不变

步骤 2:验证轨道数

在整个过程中,最多需要 4 条轨道才能满足 "后入的列车不影响先入列车按顺序驶出" 的要求。

答案:C. 4

Ⅰ. 采用非递归方式重写递归程序时必须使用栈

错误。重写递归程序时,除了栈,还可以用其他数据结构(比如循环、队列)或者直接用迭代逻辑实现,不是必须使用栈。

Ⅱ. 调用函数时,系统要用栈保存必要信息

正确。函数调用时,系统会用栈(栈帧)保存返回地址、局部变量、参数等信息。

Ⅲ. 只要确定了入栈次序,就可确定出栈次序

错误。入栈次序确定时,出栈次序有多种可能。比如入栈顺序为 1,2,3,出栈顺序可以是 3,2,1,也可以是 2,1,3 等。

Ⅳ. 栈是一种受限的线性表,允许在其两端进行操作

错误。栈只允许在一端(栈顶)进行插入和删除操作,另一端(栈底)是固定的。


综上,错误的叙述是 Ⅰ、Ⅲ、Ⅳ ,对应选项 C。✅

初始状态

  • 栈 S₁(操作数,栈顶为 2):5, 8, 3, 2
  • 栈 S₂(运算符,栈顶为 +):*, -, +

第 1 次调用 F ()

  1. 从 S₁弹出两个操作数:a=2b=3
  2. 从 S₂弹出运算符:op=+
  3. 执行运算:b op a = 3 + 2 = 5
  4. 将结果压入 S₁ → S₁变为:5, 8, 5

第 2 次调用 F ()

  1. 从 S₁弹出两个操作数:a=5b=8
  2. 从 S₂弹出运算符:op=-
  3. 执行运算:b op a = 8 - 5 = 3
  4. 将结果压入 S₁ → S₁变为:5, 3

第 3 次调用 F ()

  1. 从 S₁弹出两个操作数:a=3b=5
  2. 从 S₂弹出运算符:op=*
  3. 执行运算:b op a = 5 * 3 = 15
  4. 将结果压入 S₁ → S₁变为:15

最终 S₁栈顶保存的值是15 ,对应选项B

选项 A:1,2,5,6,4,3

  • 1 出队并输出 → 输出 1
  • 2 出队并输出 → 输出 2
  • 3 出队入栈
  • 4 出队入栈
  • 5 出队并输出 → 输出 5
  • 6 出队并输出 → 输出 6
  • 4 出栈并输出 → 输出 4
  • 3 出栈并输出 → 输出 3可以实现,不符合题意。

选项 B:2,3,4,5,6,1

  • 1 出队入栈
  • 2 出队并输出 → 输出 2
  • 3 出队并输出 → 输出 3
  • 4 出队并输出 → 输出 4
  • 5 出队并输出 → 输出 5
  • 6 出队并输出 → 输出 6
  • 1 出栈并输出 → 输出 1可以实现,不符合题意。

选项 C:3,4,5,6,1,2

  • 1 出队入栈
  • 2 出队入栈
  • 3 出队并输出 → 输出 3
  • 4 出队并输出 → 输出 4
  • 5 出队并输出 → 输出 5
  • 6 出队并输出 → 输出 6此时栈内元素为 2(栈顶)、1(栈底),接下来只能先输出 2,再输出 1,无法先输出 1 再输出 2。因此不能得到这个输出序列,符合题意。

选项 D:6,5,4,3,2,1

  • 1 出队入栈
  • 2 出队入栈
  • 3 出队入栈
  • 4 出队入栈
  • 5 出队入栈
  • 6 出队并输出 → 输出 6
  • 5 出栈并输出 → 输出 5
  • 4 出栈并输出 → 输出 4
  • 3 出栈并输出 → 输出 3
  • 2 出栈并输出 → 输出 2
  • 1 出栈并输出 → 输出 1可以实现,不符合题意。

最终答案:C

初始栈为空,入栈序列为 a, b, c, d, e

  1. Push(a) → 栈:[a]
  2. Push(b) → 栈:[a, b]
  3. Pop() → 弹出b,出栈序列:[b]
  4. Push(c) → 栈:[a, c]
  5. Pop() → 弹出c,出栈序列:[b, c]
  6. Push(d) → 栈:[a, d]
  7. Push(e) → 栈:[a, d, e]
  8. Pop() → 弹出e,出栈序列:[b, c, e]

所以最终的出栈序列是 b, c, e ,对应选项 D

相关推荐
阿Y加油吧2 小时前
面试硬核双杀!合并 K 个升序链表 + LRU 缓存|力扣高频手撕原题全解
数据结构·leetcode·链表
计算机安禾3 小时前
【数据结构与算法】第12篇:栈(二):链式栈与括号匹配问题
c语言·数据结构·c++·学习·算法·visual studio code·visual studio
散峰而望3 小时前
【数据结构】单调栈与单调队列深度解析:从模板到实战,一网打尽
开发语言·数据结构·c++·后端·算法·github·推荐算法
杨校3 小时前
杨校老师课堂备战C++之数据结构中栈结构专题训练
开发语言·数据结构·c++
keyborad pianist3 小时前
数据结构
数据结构·学习
浅念-10 小时前
Linux 开发环境与工具链
linux·运维·服务器·数据结构·c++·经验分享
x_xbx13 小时前
LeetCode:34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·leetcode
菜菜小狗的学习笔记15 小时前
剑指Offer算法题(九)搜索
数据结构·算法·深度优先
愣头不青17 小时前
96.不同的二叉搜索树
数据结构·算法·leetcode