【经典算法】-算术表达式求值

来源:互联网 发布:开发板与单片机 编辑:程序博客网 时间:2024/04/28 03:52

算术表达式求值

中缀表达式

我们平时写的计算式的式子一般是这样子

格式:"操作数1  操作符  操作数2" 12 * (3 + 4) - 6 + 8 / 2;  // 中缀表达式

中缀表达式如果要先计算操作符优先级低的两个数,比如上面要优先计算3+4,这里就必须带括号,指明计算的优先级,负责就会按照操作符默认的优先级来计算。

后缀表达式(逆波兰表达式)

上面的中缀表达式转换为后缀表达式即

格式:"操作数  操作符"12 3 4 + * 6 - 8 2 / +; //后缀表达式

怎样把中缀表达式转换为后缀表达式,在下面解释,这里先看看后缀表达式是如何计算的呢?

后缀表达式如何计算表达式

这里栈就派上用场了,从左到右一个个遍历表达式,遇到操作数就入栈,遇到操作符就依次取出栈顶的两个操作数进行计算,并把计算结果入栈,供后面计算,直到栈为空,说明表达式计算完毕,否则说明表达式有问题。过程如下图: image 


这样就可以按照操作符顺序计算,不用担心操作符优先级还要加大括号的问题。

那如何把中缀表达式转换为后缀表达式

  • 思想:
  1. 从中缀表达式中从左往右依次取出数据
  2. 如遇到操作数,直接输出到后缀的队列里。
  3. 如果遇到操作符(包括括号),这里再定义一个存放操作符的栈,则:
    i.如果操作符是'(',入栈
    ii.如果操作符是')',则把栈里的操作符依次出栈并插入到后缀序列后面,直到遇到')'.
    iii.如果操作符不是‘(’和‘)’,则:
         (1). 如果操作符的优先级比top的优先级高,则入栈
         (2).如果操作符优先级等于或小于top优先级,则将top出栈并插入到后缀序列后面,pop后,再比较栈顶元素的优先级,重复iii,直到把此操作符      插入,将此操作符入栈。
  4. 如果中序队列里的数据已经读取完毕,记录操作符的栈里,还有操作符的话,依次出栈插入到后缀序列的后面。
    此时中缀就已经转换为后缀表达式,如下图

代码实现链接点击打开github

原创粉丝点击