Oren A发布的步枪夹类比非常好,但我会尝试另一个,并尝试预测教练试图传达的内容。
顾名思义,堆栈是“事物”的排列,具有:
- 在顶上
- 一个底
- 顶部和底部之间的排序(例如,从顶部开始的第二个,从底部开始的第三个)。
(把它想象成你桌上的一摞书,你只能从上面拿东西)
将某些东西推入堆栈意味着“将其放在顶部”。从堆栈中弹出一些东西意味着“从堆栈中取出顶部的'东西'”。
一个简单的用法是颠倒单词的顺序。假设我想反转这个词:“爆米花”。我从左到右推动每个字母(所有 7 个字母),然后弹出 7 个字母,它们将以相反的顺序结束。看起来这就是他对这些表情所做的事情。
推(p) 推(o) 推(p) 推(c) 推(o) 推(r) 推(n)
压入整个单词后,堆栈看起来像:
| n | <- top
| r |
| o |
| c |
| p |
| o |
| p | <- bottom (first "thing" pushed on an empty stack)
======
当我 pop() 七次时,我按以下顺序得到字母:
n,r,o,c,p,o,p
在教授堆栈时,中缀/后缀/前缀的转换是计算机科学中的一个病态示例:
中缀到后缀的转换。
后修复转换为中缀表达式非常简单:
(从左到右扫描表达式)
- 对于每个数字(操作数),将其压入堆栈。
- 每次遇到运算符 (+,-,/,*) 从堆栈中弹出两次并将运算符放在它们之间。将其推入堆栈:
因此,如果我们有 53+2*,我们可以通过以下步骤将其转换为中缀:
- 按 5。
- 按 3。
- 遇到+:pop 3,pop 5,push 5+3入栈(与5和3的顺序一致)
- 按 2。
- 遇到 *:pop 2,pop (5+3),push (2 * (5+3))。
*当您到达表达式的末尾时,如果它的格式正确,您的堆栈应该只包含一项。
通过引入“x”和“o”,他可能一直将它们用作中缀表达式的左右操作数的临时持有者:x + o、x - o 等(或 x、o 的顺序颠倒)。
维基百科上也有一篇很好的文章。我已经将我的答案作为一个 wiki 留下,以防我搞砸了表达式的任何顺序。