调度厂算法

155 阅读1分钟

今天我们来实现一个简单的计算器。

正如我们通常了解的一个表达式可以分成三种类型, 操作符在前, 操作符在中间和操作符在后面。如下图所示:

通常情况下, postfix借助栈是很容易去进行计算的, 但是infix对于我们来说是更加自然地一种表达方式, 所以我们需要一种方法去进行转换, 将infix转换成postfix。(prefix最不常见, 所以我们暂且不考虑)

调度厂算法是迪杰斯特拉在1961提出来的, 通过一个队列和栈来进行操作。

  1. 如果是操作数, 就直接加入队列; 如果是操作符, 需要和栈顶的元素进行比较, 如果栈顶元素的优先级大于或者等于操作符, 则将栈顶元素加入队列, 然后弹出。不断重复直到栈为空, 或者优先级小于当前操作符, 然后将当前操作符加入栈;
  2. 重复上述步骤;
  3. 最后, 将栈中元素逐个加入队列。

举个例子:

A + B * C - D

输出后就可以得到:

A B C * + D -

包含括号的情况:

(A + B) * (C - D)

输出后就可以得到:

A B + C D - *

对于postfix表示借助一个栈, 很容易就可以得到结果:

  1. 如果是一个操作数, 将其压入栈中;
  2. 如果是一个操作符, 将栈中的两个元素弹出, 计算后压入栈中;
  3. 重复上述几个步骤。

举个例子:

3 4 + 5 1 - *

参考:MIT6_087IAP10_lec07.pdf