Skip to content

2018年 408 数据结构 第 2 题

数据结构2018年选择题2分

题目

现有队列 Q 与栈 S,初始时 Q 中的元素依次是 1,2,3,4,5,6(1 在队头),S 为空。若仅允许下列 3 种操作:

① 出队并输出出队元素; ② 出队并将出队元素入栈; ③ 出栈并输出出栈元素,

则不能得到的输出序列是( )。

错因

A

序列 1,2,5,6,4,3 实际上是可以得到的,但很多人卡在 4,3 这一段——以为"前面 1,2 都已经直接出队输出,5,6 又直接出队输出,3 和 4 怎么还能拿出来?"漏掉了"还可以用栈暂存"这个关键。正确做法:1、2 走 ①;3、4 走 ②(依次进栈,栈顶为 4);5、6 走 ①;最后两次 ③ 把 4、3 出栈输出。能得到。

B

序列 2,3,4,5,6,1 也是可达的。误判通常发生在最后那个 1:先出的是 2,到队末才出 1,看起来"队头反而最后出现"——其实只要把 1 一开始就用 ② 入栈,等其余元素都按 ① 出完,再用 ③ 把栈里的 1 弹出即可。可行序列。

D

D = 6,5,4,3,2,1 是经典的"队列借栈反转"序列,可以得到——把 1~6 依次用 ② 全部进栈(此时栈底→栈顶为 1,2,3,4,5,6),再连续 ③ 弹出即得 6,5,4,3,2,1。看到完全逆序就排除是错的,这个题的核心是 LIFO 一旦只允许"前缀进栈+后缀全弹",反而就只能反转 栈里 的部分。

总解析

这类题的本质:每个元素只有两条出口可走——

  • 走 ①:直接从队头输出,先后顺序与原队列一致;
  • 走 ②+③:先压进栈再弹出,相对顺序在栈里被 LIFO 翻转。

两类元素交错时不能换序:已经"路过栈"的元素,必须按入栈反序输出;后压进栈的必须先出来。

逐项检验是否能凑出输出:

  • A 1,2,5,6,4,3:1①、2①、3②、4②(栈底→顶 = 3,4)、5①、6①、4③、3③ → 输出正是 1,2,5,6,4,3 ✓
  • B 2,3,4,5,6,1:1②(栈 = 1)、2①、3①、4①、5①、6①、1③ → 2,3,4,5,6,1 ✓
  • C 3,4,5,6,1,2:要求 3,4,5,6 先出现,意味着 1、2 必须先用 ② 进栈(否则没法跨过 1、2 直接拿 3)。此时栈底→顶 = 1,2。接着 3①、4①、5①、6① 把队列出空,最后只剩栈中的 1、2。但栈是 LIFO,只能先弹 2 再弹 1,输出顺序只能是 …,2,1,得不到 …,1,2。✗
  • D 6,5,4,3,2,1:1~6 全部走 ②(栈底→顶 = 1,2,3,4,5,6),再连续 ③ 弹出 → 6,5,4,3,2,1 ✓

判断诀窍:栈里残留的元素,输出顺序必须是入栈顺序的逆序。C 选项要求 1 在 2 前面输出,但 1 必然先入栈、在 2 之下,违反了 LIFO,所以它是唯一不可达的。

最终答案是 C

最后更新:

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

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