Appearance
题目
现有队列 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。