今有一空栈 $S$,对下列待进栈的数据元素序列 $a,b,c,d,e,f$ 依次进行进栈,进栈,出栈,进栈, 进栈,出栈的操作,则此操作完成后,栈 $S$ 的栈顶元素为:
这题就是考栈的后进先出特性,拿到题别急着背口诀,直接在草稿纸上按顺序画栈的变化,哪一步进、哪一步出,把栈里剩下的元素顺下来,答案自然浮现。
最容易栽跟头的就是操作顺序看串,把“进、进、出、进、进、出”看错,或者把“出栈”当成“出栈后栈空了”以为后面元素全没了。还有一种坑是看到序列里有 f,下意识觉得 f 肯定在栈里,其实 f 根本没进过栈,纯属干扰项。
这道题考查的是栈(Stack)的基本操作模拟,核心就是“后进先出”(LIFO)。命题人喜欢这种纯操作序列的题,不考复杂算法,就考你手不抖、眼不花,按顺序一步步来。这类题在 NOIP 普及组初赛里考频不低,近三年(2023、2024、2025)各出现 1 次,属于高频必会点。
拿到题,思考心法很简单:先看清操作序列,再在纸上画一个栈框,从底到顶依次标记元素。每一步只做一件事:如果是“进栈”,就把新元素写在栈顶;如果是“出栈”,就把当前栈顶划掉,记住它被弹出去了,后面不再出现。千万别想当然,比如以为“出栈”后栈就空了,或者以为后面的元素会自动补位。
具体到这道题,操作序列是:进 a、进 b、出、进 c、进 d、出。
第 1 步:进 a,栈变成 [a],a 在底。 第 2 步:进 b,栈变成 [a, b],b 在顶上。 第 3 步:出,把 b 弹出去,栈剩 [a],b 彻底没了,后面不会再有 b。 第 4 步:进 c,栈变成 [a, c],c 顶上。 第 5 步:进 d,栈变成 [a, c, d],d 顶上。 第 6 步:出,把 d 弹出去,栈剩 [a, c],c 顶上。
操作结束,栈里只有 a 和 c,a 在底,c 在顶。题目问的是“栈顶元素”,那就是 c。
选项分析:A 说 f,f 根本没进过栈,纯属干扰;C 说 a,a 在栈底,不是顶;D 说 b,b 在第 3 步就被弹出去了,不可能还在栈里。只有 B 正确。
避坑提醒:做题时别被长序列吓到,也别被序列里出现的字母迷惑(比如 f 这种没出现的)。关键是严格按顺序模拟,每一步只关注栈的变化,不要跳步,不要脑补。在纸上画出来,答案一目了然。