Skip to content

2011年 408 数据结构 第 2 题

数据结构2011年选择题2分

题目

元素 a,b,c,d,e 依次进入初始为空的栈中,若元素进栈后可停留、可出栈,知道所有元素都出栈,则在所有可能的出现序列中,以元素 d 开头的序列个数是( )。

错因

A

漏算了 e 在 c, b, a 中间插入的位置。pop d 之后栈剩 [a, b, c](c 在顶),剩余 4 个元素出栈位置上 e 有 4 个候选位(c 之前/c 与 b 之间/b 与 a 之间/a 之后),不是 3 个。

C

可能多算了一种"e 在 d 之前出栈"的情况。但要让 d 第一个出栈,d 必须在最早被 pop——若 e 先于 d 出,d 不能再排第一。所以 e 只能在 d 之后出栈,候选位 4 个不是 5 个。

D

把"剩余 c, b, a 必须按栈顺序出栈"这条铁规则忘了。pop d 后栈是 [a, b, c],c 必须先于 b 出,b 必须先于 a 出。如果允许 a, b, c 任意排列就会算成 6 种,但栈的 LIFO 性质把 6 砍到 4。

总解析

要让 d 第一个出栈,必须先 push a, b, c, d,紧接着 pop d——此时 e 还没进栈。

pop d 之后栈中剩 [a, b, c](c 在栈顶),而 e 还在等着进栈。剩余 4 个元素的出栈顺序由两条约束决定

  1. c, b, a 必须保持 LIFO 顺序:c 先出,b 次之,a 最后(栈底元素先进后出)
  2. e 进栈出栈的时机自由——它可以在"c 之前"、"c 与 b 之间"、"b 与 a 之间"、"a 之后"任一位置出栈

所以 e 有 4 个候选位,对应 4 种序列:

e 位置完整序列
c 之前d, e, c, b, a
c 与 b 之间d, c, e, b, a
b 与 a 之间d, c, b, e, a
a 之后d, c, b, a, e

最终答案是 B(4)

最后更新:

🎬 可视化演示
加载中...

提示:可在可视化区直接操作播放、步进、修改参数