堆栈的动态

The dynamic of a stack

本文关键字:动态 堆栈      更新时间:2023-10-16

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

我有这个后缀符号:

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)

我看到下面也有一些更正确的解释。我在这里做了尽可能详细的工作,以便更容易理解其他人是否需要它。

对于序列中的每个元素:

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

有两个主要规则:

  • 如果元素是操作数,则将其推送到堆栈上
  • 如果是运算符,则通过弹出两个元素来执行此操作,然后再次将结果推送到堆栈上

例:

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) + 并计算 a + 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)

总计是

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

不出所料


参考:使用堆栈进行后缀评估

堆栈进度为:

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

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

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

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