对于一个简单的表达式 3+4-5,我们人是有思维能力的,能根据操作符的位置,以及操作符的优先级别能算出该表达式的结果。但是计算机怎么算?
计算机必须要向前(从左到右)来读取操作数和操作符,等到读取足够的信息来执行一个运算时,找到两个操作数和一个操作符进行运算,有时候如果后面是更高级别的操作符或者括号时,就必须推迟运算,必须要解析到后面级别高的运算,然后回头来执行前面的运算。我们发现这个过程是极其繁琐的,而计算机是一个机器,只认识高低电平,想要完成一个简单表达式的计算,我们可能要设计出很复杂的逻辑电路来控制计算过程,那更不用说很复杂的算术表达式,所以这样来解析算术表达式是不合理的,那么我们应该采取什么办法呢?
请大家先看看什么是前缀表达式,中缀表达式,后缀表达式:这三种表达式其实就是算术表达式的三种写法,以 3+4-5为例
①、前缀表达式:操作符在操作数的前面,比如 + -5 4 3
②、中缀表达式:操作符在操作数的中间,这也是人类最容易识别的算术表达式 3 + 4 - 5
③、后缀表达式:操作符在操作数的后面,比如 3 4 + 5 -
上面我们讲的人是如何解析算术表达式的,也就是解析中缀表达式,这是人最容易识别的,但是计算机不容易识别,计算机容易识别的是前缀表达式和后缀表达式,将中缀表达式转换为前缀表达式或者后缀表达式之后,计算机能很快计算出表达式的值,那么中缀表达式如何转换为后缀表达式呢?
接下来我们以1 + ((2 +3)* 4)- 5为例,详细探究一下这个过程。
第一步,先将每一部分的表达式都加上括号。
第二步,将每部分括号内的运算符拉到相应括号的右侧。
最后,去掉所有括号,就可以得到后缀表达式。
逆波兰表达式是一种后缀表达式,它将运算符放置在操作数之后。逆波兰表达式求值的过程是从左到右扫描表达式,遇到数字时将数字压入栈中,遇到运算符时弹出栈顶的两个数字进行运算,并将结果压入栈中。最终栈中只剩下一个数字,即为表达式的值。
以下是逆波兰表达式求值的Java代码和详细讲解:
具体操作步骤如下:
1.创建一个栈来存储数字。
2.从左到右遍历逆波兰表达式中的每个元素。
3.如果当前元素是运算符,则从栈中弹出两个数字进行运算,并