Предполагая, что это какая-то домашняя работа, и вы хотите сделать это самостоятельно ..
Я сделал это один раз, вам нужен стек
Итак, что вы делаете для примера:
parse what to do? Stack looks like
( push it onto the stack (
5 push 5 (, 5
+ push + (, 5, +
2 push 2 (, 5, +, 2
) evaluate until ( 7
* push * 7, *
7 push 7 +7, *, 7
eof evaluate until top 49
Символы типа "5" или "+" могут быть просто сохранены как строки или простые объекты, или вы можете сохранить + как объект + () без установки значений и устанавливать их при оценке.
Полагаю, для этого также требуется порядок приоритета, поэтому я опишу, как это работает.
в случае: 5 + 2 * 7
Вы должны нажать 5 push + push 2, следующая операция имеет более высокий приоритет, поэтому вы также нажимаете ее, а затем нажимаете три. Когда вы встречаете либо a), либо конец файла, либо оператор с более низким или равным приоритетом, вы начинаете вычислять стек до предыдущего (или начала файла.
Поскольку ваш стек теперь содержит 5 + 2 * 7, при его оценке вы сначала вставляете 2 * 7 и помещаете получившийся узел * (2,7) в стек, а затем еще раз оцениваете три верхних элемента на стек (5 + * узел), поэтому дерево получается правильным.
Если бы он был заказан другим способом: 5 * 2 + 7, вы будете толкать, пока не попадете в стек с «5 * 2», тогда вы достигнете более низкого приоритета +, что означает оценку того, что у вас есть сейчас. Вы оценили бы 5 * 2 в * узел и нажали его, затем продолжили бы, нажав + и 3, чтобы у вас был * узел + 7, после чего вы оценили бы это.
Это означает, что у вас есть переменная с «наибольшим текущим приоритетом», которая хранит 1, когда вы нажимаете +/-, 2, когда вы нажимаете * или / и 3 для «^». Таким образом, вы можете просто проверить переменную, чтобы увидеть, является ли приоритет вашего следующего оператора <= ваш текущий приоритет. </p>
если ")" считается приоритетом 4, вы можете рассматривать его как другие операторы, за исключением того, что он удаляет соответствующий "(", более низкий приоритет не будет.