某文本编辑器把用户输入的字符依次压入栈 S。用户依次输入 X、Y、Z、W 后,连续执行两次撤销操作。每次撤销都会弹出栈顶一个字符。此时栈从栈底到栈顶的内容是( )。
栈是后进先出(LIFO)结构。入栈push,出栈pop。常用于括号匹配、表达式求值、函数调用栈。
注意栈空时执行pop操作会导致下溢(underflow)。C++ STL stack 的 top() 在栈空时行为未定义。
【考点】栈(Stack)|后进先出(LIFO)|撤销操作(弹出)
考纲定位:GESP 六级数据结构模块的栈基础题,命题人卡住的是对"后进先出"动态变化的理解不足——多数考生只会背"栈顶是最后入的",却搞不清多次弹出后栈底到栈顶的真实顺序。
解题思维:输入 X、Y、Z、W 依次压栈,栈顶为 W;撤销即弹出栈顶,第一次撤销弹出 W,栈顶变为 Z;第二次撤销再弹出 Z,栈顶变为 Y。栈从底到顶只剩 X、Y。通法:栈的所有操作都基于 LIFO,撤销/弹出操作总是作用于当前栈顶,与输入顺序无关,只与当前栈顶有关。这类题的关键是动态追踪栈顶变化,而非静态记忆输入顺序。
陷阱拆解:B 项把被弹出的 Z 保留,混淆了"撤销"与"删除";C 项误以为撤销两次后保留 Y 和 Z,没意识到第二次撤销后 Y 成为新栈顶;D 项保留 X 和 Z,错误理解栈底元素不受撤销影响。命题人利用对栈顶/栈底概念混淆、对撤销操作次数理解错误、以及对栈的 LIFO 特性机械记忆而不理解动态变化。如果你只背结论"撤销两次后保留前两个",就会掉进 B 或 D 的陷阱。
反命题思维:若改为"输入 X、Y、Z、W 后执行三次撤销",答案应为 X;若改为"执行一次撤销",答案为 X、Y、Z。命题人想考的是对栈操作的理解深度,而不仅仅是机械执行步骤。刷到类似题时,先问自己"命题人想考我什么",是考栈的 LIFO 特性,还是考撤销操作的次数,还是考栈底与栈顶的区分。