修改分流场算法以包括墙运算符|

时间:2017-03-08 23:07:44

标签: algorithm postfix-notation shunting-yard

如何修改标准Shunting Yard Algorithm以包含'wall'符号,|,表示函数参数的结尾?也就是说,支持修改后缀表示法(反向波兰表示法),它允许具有任意数量参数的函数。

修改后缀表示法的几个例子:

f (1,2)+9⟶| 1 2 f 9 +
f (1,2,3)+9⟶| 1 2 3 f 9 +

请,我正在寻找实际的修改,而不仅仅是如何做到这一点。

分流场算法

  1. 虽然有令牌需要阅读:
  2. 阅读令牌。
  3. 如果令牌是数字,则将其推送到输出队列。
  4. 如果令牌是功能令牌,则将其推入堆栈。
  5. 如果令牌是函数参数分隔符(例如,逗号):
    • 直到堆栈顶部的标记是左括号,将操作符弹出堆栈到输出队列。如果没有遇到左括号,则分隔符放错位置或括号不匹配。
  6. 如果令牌是运营商o1,那么:

    • 虽然在运算符堆栈的顶部有一个运算符标记o2,但

      • o1是左关联的,其优先级小于或等于o2的优先级,或
      • o1是右关联的,优先级小于o2,

        -pop o2关闭运算符堆栈,进入输出队列;

      • 在迭代结束时将o1推入操作员堆栈。
  7. 如果令牌是左括号(即“(”),则将其推入堆栈。
  8. 如果令牌是右括号(即“)”):
    • 直到堆栈顶部的标记是左括号,将操作符弹出堆栈到输出队列。
    • 从堆栈中弹出左括号,但不弹出输出队列。
    • 如果堆栈顶部的令牌是函数令牌,则将其弹出到输出队列。
    • 如果堆栈用完而没有找到左括号,则括号不匹配。
  9. 当没有更多令牌可供阅读时:
    • 虽然堆栈中仍有运算符令牌:
      • 如果堆栈顶部的操作员令牌是括号,则括号不匹配。
      • 将操作符弹出到输出队列。
  10. 退出。

1 个答案:

答案 0 :(得分:0)

解决方案:

在步骤4中,除了将函数推送到堆栈外,还要写入|符号到输出后缀表达式。

当然,评估此修改后的后缀表达式的算法本身必须进行修改以考虑墙符号。