码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-11-03 11:16:17      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:没有   表达   前缀表达式   因此   数字   一个栈   isp   postfix   png   

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

  • 中缀表达式(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):

 

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

标签:没有   表达   前缀表达式   因此   数字   一个栈   isp   postfix   png   

原文地址:https://www.cnblogs.com/yy-1046741080/p/11785146.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!