Мне нужно немного помочь с пониманием dymanic стека в структурах данных.
У меня есть эта надстрочная нотация:
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) стек заполнен 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
как и ожидалось
Ссылки: оценка Postfix со стеком
Прогрессия стека:
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
Учитывая, что все операции являются двоичными, общий алгоритм:
Если элемент является операндом, тогда нажмите (сохраните) его в стек.
Если элемент является операцией, затем поп (загрузите) два верхних большинства значения из стека, выполните операцию над ними и нажмите (сохраните) результат обратно в стек.