长话短说我的讲师很废话,并且通过高架投影仪向我们展示了中缀,并且他的巨大阴影阻挡了所有内容,所以我错过了重要的东西
他指的是push和pop,push = 0 pop = x
他举了一个例子,但我看不出他是如何得到答案的,
2*3/(2-1)+5*(4-1)
第1步反向:)1-4(*5+)1-2(/3*2
好的,我可以看到
回答14-5*12-32*/+
然后再次撤消以获取+/*23-21*5-41
如果有人可以向我解释推送流行音,那么我可以理解我会非常精彩,我已经在网上看了很多东西我发现似乎比这更好了,所以我真的需要先了解一下
答案 0 :(得分:102)
希望这有助于您可视化堆栈及其工作原理。
空堆栈:
| |
| |
| |
-------
推送A
之后,你得到:
| |
| |
| A |
-------
推送B
之后,你得到:
| |
| B |
| A |
-------
弹出后,你得到:
| |
| |
| A |
-------
推送C
之后,你得到:
| |
| C |
| A |
-------
弹出后,你得到:
| |
| |
| A |
-------
弹出后,你得到:
| |
| |
| |
-------
答案 1 :(得分:13)
由 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)
======
当我弹出()七次时,我按此顺序收到字母:
N,R,O,C,P,O,P
转换中缀/后缀/前缀是教学堆栈时计算机科学的一个病态实例:
将修补程序转换为中缀表达式非常简单:
(从左到右扫描表达式)
因此,如果我们有53 + 2 *,我们可以通过以下步骤将其转换为中缀:
*当你到达表达式的末尾时,如果它正确形成,你的堆栈应该只包含一个项目。
通过引入'x'和'o',他可能一直使用它们作为中缀表达式的左右操作数的临时持有者:x + o,x-o等(或x,o的顺序颠倒) )。
还有一个很好的write up on wikipedia。我把答案留给了wiki,因为我搞砸了任何表达式。
答案 2 :(得分:10)
从中缀到前缀表达式的算法是:
-reverse input
TOS = top of stack
If next symbol is:
- an operand -> output it
- an operator ->
while TOS is an operator of higher priority -> pop and output TOS
push symbol
- a closing parenthesis -> push it
- an opening parenthesis -> pop and output TOS until TOS is matching
parenthesis, then pop and discard TOS.
-reverse output
所以你的例子就像(x PUSH,o POP):
2*3/(2-1)+5*(4-1)
)1-4(*5+)1-2(/3*2
Next
Symbol Stack Output
) x )
1 ) 1
- x )- 1
4 )- 14
( o ) 14-
o 14-
* x * 14-
5 * 14-5
+ o 14-5*
x + 14-5*
) x +) 14-5*
1 +) 14-5*1
- x +)- 14-5*1
2 +)- 14-5*12
( o +) 14-5*12-
o + 14-5*12-
/ x +/ 14-5*12-
3 +/ 14-5*12-3
* x +/* 14-5*12-3
2 +/* 14-5*12-32
o +/ 14-5*12-32*
o + 14-5*12-32*/
o 14-5*12-32*/+
+/*23-21*5-41
答案 3 :(得分:4)
堆栈是LIFO(后进先出)数据结构。推送和弹出操作很简单。推送东西放在堆栈上,弹出取消一些东西。你把它放在顶部,然后取下顶部,以保留LIFO订单。
编辑 - 从FIFO校正到LIFO。捂脸!
来说明,你从一个空白堆栈开始
|
然后你按'x'
|的 'x'
然后你推'y'
| 'x''y'
然后你弹出
|的 'x'
答案 4 :(得分:3)
确定。正如其他回答者所解释的那样,堆栈是一种后进先出的数据结构。使用Push操作将元素添加到堆栈顶部。使用Pop操作从顶部取出一个元素。元素的移除顺序与它们插入的顺序相反(因此为Last In,First Out)。例如,如果按顺序推动元素1,2,3,则数字3将位于堆栈的顶部。 Pop操作将删除它(它是最后一个)并在堆栈顶部留下2。
关于讲座的其余部分,讲师试图描述一个评估算术表达式的基于堆栈的机器。机器通过从堆栈顶部连续弹出3个元素来运行。前两个元素是操作数,第三个是运算符(+, - ,*,/)。然后,它将此运算符应用于操作数,并将结果推送到堆栈。该过程一直持续到堆栈中只有一个元素为止,这是表达式的值。
因此,假设我们首先按从左到右的顺序将值“+ / * 23-21 * 5-41”推入堆栈。然后我们从顶部弹出3个元素。最后一个是先出,这意味着前三个元素按顺序是“1”,“4”和“ - ”。我们将数字3(4-1的结果)推入堆栈,然后弹出三个最顶层的元素:3,5,*。将结果15推入堆栈,依此类推。
答案 5 :(得分:3)
答案 6 :(得分:2)
原则上堆栈非常简单:想象一下步枪的夹子 - 你只能访问最顶层的子弹 - 取出它被称为“pop”,插入一个新的称为“push”。
一个非常有用的示例是允许您“撤消”的应用程序
想象一下,您将应用程序的每个状态保存在堆栈中。例如用户制作的每种类型后的应用程序状态
现在,当用户按下“撤消”时,您只需从堆栈“弹出”前一个状态。对于用户执行的每个操作 - 您将新状态“推送”到堆栈(当然这简化了)
关于你的讲师具体做了什么 - 为了解释它,更多的信息会有所帮助..
答案 7 :(得分:2)
简单地:
pop :返回顶部的项目,然后将其从堆栈中移除
推送:将商品添加到堆栈顶部。
答案 8 :(得分:1)