一,中缀表达式和后缀表达式
首先我们需要一个知识储备,如何将中缀表达式转化为后缀表达式(逆波兰表达式),并且了解他的计算原理。
步骤:
第一步:给所有要计算的值加上括号
第二步:将括号里的位运算符号移到括号外
第三步:去掉括号,得到逆波兰表达式
就拿题目里的例子来说:
计算原理:将数字依次入栈,遇到操作符弹出2个数字,并将第一个弹出的数字作为右操作数,第二个作为左操作数,将第一次计算的结果再入栈,依次循环,得到最终结果。
二,代码求解
思想:这题是典型的利用栈的思想去解决问题,利用压栈和出栈的操作可以解决,首先定义一个栈,然后遍历这个字符数组,遇到数字就压栈,遇到位操作符就出栈,这里要注意出栈的细节,定义俩个变量来控制左右操作数,然后用switch语句来实现加减乘除的运算,最后得到的数就是计算的结果。
代码如下:
publicintevalRPN(String[] tokens) { Stack<Integer>stack=newStack<>(); for (Stringx : tokens) { //判断获取到的是数字还是符号if (!isOperation(x)) { stack.push(Integer.parseInt(x)); } else { intnum2=stack.pop(); intnum1=stack.pop(); switch (x) { case"+": stack.push(num1+num2); break; case"-": stack.push(num1-num2); break; case"*": stack.push(num1*num2); break; case"/": stack.push(num1/num2); break; } } } returnstack.pop();//获取最后的值 } //判断位操作符privatebooleanisOperation(Stringx) { if (x.equals("+") ||x.equals("-") ||x.equals("*") ||x.equals("/")) { returntrue; } returnfalse; }