含有+-*/()的表达式求值

Posted yy-1046741080

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了含有+-*/()的表达式求值相关的知识,希望对你有一定的参考价值。

对于表达式,有常用的几种形式:

  • 中缀表达式(Infix expression):操作符位于两个操作数中间,算术表达式的常规表示法。需要用括号和优先规则排除多义性。(这也正是编写程序的麻烦点,需要制定完整的优先规则)(A+B)*C-D/(E+F)
  • 后缀表达式(Postfix expression),逆波兰表示法,操作符位于操作数后面。这种方法使表达式求值很方便。AB+C*DEF+/- 。
  • 前缀表达式(Prefix expression):也叫波兰表示法,操作符写在操作数的前面。这种方法常用于编译器设计方面。-*+ABC/D+EF  

(在这里,不考虑前缀表示法)

 

 

为了简化问题,关注算法,本文的讨论基于以下三点:

  1. 只考虑 + - * / ( ) 这几个基本运算符。
  2. 运算数只考虑 0-9,这10个简单的数,方便从string中取出来。
  3. 输入的表达式没有语法错误。

 


 

现在先不考虑求值,先来考虑一个有趣的东西:表达式树

技术图片

 

 


先考虑最简单的表示法:如果给出后缀表达式,AB+C*DEF+/-

 

算法思路:

  • 给出后缀表达式S;建立一个栈,数字栈stack1。
  • 循环读入表达式的每一个单元:
    • 如果读入的字符是数字,那么入栈;
    • 如果读入的字符是符号,那么弹栈两次,后弹出来的记为n1,先弹出来的记为n2;那么结果就为n1-n2;然后将结果入栈。
  • 最后在栈中会得到最终结果。

 

因为后缀表达式不需要进行优先级规则的判断,因此,处理规则异常简单,只需要直接判断就行了。


如果给出的是中缀表达式,(A+B)*C-D/(E+F):

 

以上是关于含有+-*/()的表达式求值的主要内容,如果未能解决你的问题,请参考以下文章

表达式·表达式树·表达式求值

表达式求值(后缀表达式求值)

C++:算术表达式求值

C语言关于表达式求值

如果表达式的求值需要对引用求值,为啥它不是“核心常量表达式”?

C语言编一个实现简单的算术表达式求值的代码。