堆栈的动态

时间:2014-02-08 12:59:12

标签: c++ c stack

我需要一些帮助来理解数据结构中堆栈的动态。

我有这个后缀符号:

a b c d * + 3 * + 5 6 2 c * + * +

评估将是:

a + 3b + 3cd + 30 + 10c

但是找出这个堆栈动态的算法是什么?

LE:谢谢各位同事帮助我理解它。

-> a, b, c, d 
-> a, b c * d 
-> a, b + c * d, 3 
-> 3 * (b + c * d), a 
-> 2 * c, 6, 5, a + (b + c * d) + 3
-> 5 * (6 + 2 * c), a + (b + c * d) + 3
-> a + (b + c * d) + 3 + 5 * (6 + 2 * c)

我看到以下是一些更正确的解释。我在这里做得很详细,如果其他人需要的话,我可以更容易理解。

3 个答案:

答案 0 :(得分:2)

对于序列中的每个元素:

  • 如果元素是操作数,则将其推入堆栈。 (堆栈增长一个。)
  • 如果元素是运算符,则从堆栈中弹出两个元素,应用运算符,将结果推回堆栈。 (堆栈缩小了一个。)

答案 1 :(得分:2)

有两个主要规则:

  • 如果元素是操作数,则将其推入堆栈
  • 如果是操作员,请通过弹出两个元素然后再将结果推到堆栈上来执行操作

实施例

1)堆栈用abcd填充

a b c d

2)遇到*,弹出c和d,执行c * d并将结果推到堆栈上

a b cd

3)遇到+,计算b + cd

a b+cd

3)3被推入堆栈

a b+cd 3
遇到

4)*并计算(b + cd)* 3 = 3b + 3cd

a 3(b+cd)

5)遇到+并计算+ 3(b + cd)

a+3(b+cd) (one element on the stack)

6)推出5,6,2,c

a+3(b+cd) 5 6 2 c

7)*遇到了

a+3(b+cd) 5 6 2*c

8)遇到+

a+3(b+cd) 5 6+2*c

9)*遇到了

a+3(b+cd) 5*(6+2*c)

10)遇到+

a+3(b+cd)+5*(6+2*c)

Grand-total是

a + 3b + 3cd + 30 + 10c

按预期


参考文献:Postfix evaluation with a stack

答案 2 :(得分:1)

堆栈进度为:

a b c d f g 3 h i 5 6 2 c j k m n
  a b c b a g a   i 5 6 2 6 5 i
    a b a   a       i 5 6 5 i
      a               i 5 i
                        i

<强>其中:

f = d*c
g = d*c+b
h = 3*(d*c+b)
i = 3*(d*c+b)+a
j = c*2
k = c*2+6
m = (c*2+6)*5
n = (c*2+6)*5+3*(d*c+b)+a

鉴于所有操作都是二进制的,一般算法是:

  • 如果元素是操作数,则将其推送(存储)到堆栈中。

  • 如果元素是一个操作,则从堆栈中弹出(加载)两个最顶层的值,对它们执行操作,然后将结果推送(存储)到堆栈中。

    < / LI>