Push和Pop对Stacks意味着什么?

时间:2010-09-29 19:17:45

标签: terminology push pop infix-notation stack

长话短说我的讲师很废话,并且通过高架投影仪向我们展示了中缀,并且他的巨大阴影阻挡了所有内容,所以我错过了重要的东西

他指的是push和pop,push = 0 pop = x

他举了一个例子,但我看不出他是如何得到答案的,

2*3/(2-1)+5*(4-1)

第1步反向:)1-4(*5+)1-2(/3*2好的,我可以看到

然后他继续写x和o的操作,我完全失去了

回答14-5*12-32*/+然后再次撤消以获取+/*23-21*5-41

如果有人可以向我解释推送流行音,那么我可以理解我会非常精彩,我已经在网上看了很多东西我发现似乎比这更好了,所以我真的需要先了解一下

9 个答案:

答案 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

转换中缀/后缀/前缀是教学堆栈时计算机科学的一个病态实例:

Infix to Postfix conversion.

将修补程序转换为中缀表达式非常简单:

(从左到右扫描表达式)

  1. 对于每个数字(操作数),将其推入堆栈。
  2. 每次遇到一个操作符(+, - ,/,*)从堆栈弹出两次并将操作符放在它们之间。把它推到堆栈上:
  3. 因此,如果我们有53 + 2 *,我们可以通过以下步骤将其转换为中缀:

    1. 按5。
    2. 推3。
    3. 遇到+:弹出3,弹出5,在堆栈上按5 + 3(与5和3的排序一致)
    4. 推2。
    5. 遇到*:pop 2,pop(5 + 3),push(2 *(5 + 3))。
    6. *当你到达表达式的末尾时,如果它正确形成,你的堆栈应该只包含一个项目。

      通过引入'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)

  • push =添加到堆栈
  • pop =从堆栈中删除

答案 6 :(得分:2)

原则上堆栈非常简单:想象一下步枪的夹子 - 你只能访问最顶层的子弹 - 取出它被称为“pop”,插入一个新的称为“push”。
一个非常有用的示例是允许您“撤消”的应用程序 想象一下,您将应用程序的每个状态保存在堆栈中。例如用户制作的每种类型后的应用程序状态 现在,当用户按下“撤消”时,您只需从堆栈“弹出”前一个状态。对于用户执行的每个操作 - 您将新状态“推送”到堆栈(当然这简化了) 关于你的讲师具体做了什么 - 为了解释它,更多的信息会有所帮助..

答案 7 :(得分:2)

简单地:

  • pop :返回顶部的项目,然后将其从堆栈中移除

  • 推送:将商品添加到堆栈顶部。

答案 8 :(得分:1)

在所有这些好例子之后,亚当尚克曼仍然无法理解它。我认为你应该打开一些代码并尝试一下。第二个你尝试myStack.Push(1)和myStack.Pop(1)你真的应该得到图片。但从它的外观来看,即使这对你来说也是一个挑战!