含有+-*/()的表达式求值
Posted yy-1046741080
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了含有+-*/()的表达式求值相关的知识,希望对你有一定的参考价值。
对于表达式,有常用的几种形式:
- 中缀表达式(Infix expression):操作符位于两个操作数中间,算术表达式的常规表示法。需要用括号和优先规则排除多义性。(这也正是编写程序的麻烦点,需要制定完整的优先规则)(A+B)*C-D/(E+F)
- 后缀表达式(Postfix expression),逆波兰表示法,操作符位于操作数后面。这种方法使表达式求值很方便。AB+C*DEF+/- 。
- 前缀表达式(Prefix expression):也叫波兰表示法,操作符写在操作数的前面。这种方法常用于编译器设计方面。-*+ABC/D+EF
(在这里,不考虑前缀表示法)
为了简化问题,关注算法,本文的讨论基于以下三点:
- 只考虑 + - * / ( ) 这几个基本运算符。
- 运算数只考虑 0-9,这10个简单的数,方便从string中取出来。
- 输入的表达式没有语法错误。
现在先不考虑求值,先来考虑一个有趣的东西:表达式树
先考虑最简单的表示法:如果给出后缀表达式,AB+C*DEF+/-
算法思路:
- 给出后缀表达式S;建立一个栈,数字栈stack1。
- 循环读入表达式的每一个单元:
- 如果读入的字符是数字,那么入栈;
- 如果读入的字符是符号,那么弹栈两次,后弹出来的记为n1,先弹出来的记为n2;那么结果就为n1-n2;然后将结果入栈。
- 最后在栈中会得到最终结果。
因为后缀表达式不需要进行优先级规则的判断,因此,处理规则异常简单,只需要直接判断就行了。
如果给出的是中缀表达式,(A+B)*C-D/(E+F):
以上是关于含有+-*/()的表达式求值的主要内容,如果未能解决你的问题,请参考以下文章