堆栈的动态
The dynamic of a 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)
我看到下面也有一些更正确的解释。我在这里做了尽可能详细的工作,以便更容易理解其他人是否需要它。
对于序列中的每个元素:
- 如果元素是操作数,请将其推送到堆栈。(堆栈增长 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
鉴于所有操作都是二进制的,一般算法为:
如果元素是操作数,则将其推送(存储)到堆栈中。
如果元素是一个操作,则从堆栈中弹出(加载)两个最上面的值,对它们执行操作,然后将结果推送(存储)回堆栈。
相关文章:
- 如何在C++中为堆栈动态创建结构?
- c++ 动态内存 堆栈中的分配
- 在堆或堆栈上分配的动态创建的字符串 - C
- 使用数组C++的动态堆栈
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 为什么不能在 Visual C++ 中动态分配堆栈内存?但海湾合作委员会可以做到
- 为什么要对堆栈中的内存使用自定义动态内存分配?
- 我如何转换一个基于动态的,基于指针的int堆栈,以便将其打印成字符串
- 当一个类在构造函数处动态分配自己时,为什么会发生堆栈溢出而不是 std::bad_alloc
- 堆栈动态和堆栈动态数组
- 附加到具有非动态分配堆栈的向量
- 可以作为固定大小(堆栈)和动态大小(堆)工作的数组封装程序
- 链表与动态数组用于使用向量类实现堆栈
- 除了堆栈和堆模型之外,还为C++实现了哪些其他形式的自动和动态存储
- 带有指针的动态堆栈结构
- 动态堆栈、编译时出错、dev编译器和g++
- C++ 中的动态堆栈数据类型声明
- 如何显示动态堆栈和队列(c++)中的所有元素
- C++Visual Studio 2010,在实现动态堆栈时编译错误C3867
- 动态堆栈分配(来自c++思维)