今天我们来实现一个简单的计算器。
正如我们通常了解的一个表达式可以分成三种类型, 操作符在前, 操作符在中间和操作符在后面。如下图所示:
通常情况下, postfix借助栈是很容易去进行计算的, 但是infix对于我们来说是更加自然地一种表达方式, 所以我们需要一种方法去进行转换, 将infix转换成postfix。(prefix最不常见, 所以我们暂且不考虑)
调度厂算法是迪杰斯特拉在1961提出来的, 通过一个队列和栈来进行操作。
- 如果是操作数, 就直接加入队列; 如果是操作符, 需要和栈顶的元素进行比较, 如果栈顶元素的优先级大于或者等于操作符, 则将栈顶元素加入队列, 然后弹出。不断重复直到栈为空, 或者优先级小于当前操作符, 然后将当前操作符加入栈;
- 重复上述步骤;
- 最后, 将栈中元素逐个加入队列。
举个例子:
A + B * C - D
输出后就可以得到:
A B C * + D -
包含括号的情况:
(A + B) * (C - D)
输出后就可以得到:
A B + C D - *
对于postfix表示借助一个栈, 很容易就可以得到结果:
- 如果是一个操作数, 将其压入栈中;
- 如果是一个操作符, 将栈中的两个元素弹出, 计算后压入栈中;
- 重复上述几个步骤。
举个例子:
3 4 + 5 1 - *
参考:MIT6_087IAP10_lec07.pdf