中缀表达式转后缀表达式:
中缀表达式:a+b*c+(d*e+f)*g
((a+(b*c))+(((d*e)+f)*g)) //按照计算顺序依次给表达式带上括号
((a(bc)*)+(((de)*f)+g)*)+ //依次把括号里的运算符放到括号外边
a b c * + d e * f + g * + //去掉所有括号
后缀表达式为:a b c * + d e * f + g * +
前缀表达式则是将刚才的运算符放到括号的前面:+ + a * b c * + * d e f g
逆波兰表达式(由后缀表达式计算中缀的值):
计算方法:
1.开始遍历字符串,依次将字符串放入栈中
2.遇到第一个运算符时,将栈顶第一个元素放到运算符右边,将第二个元素放到运算符左边,将得到的计算结果放入栈中
3.重复上述操作,直到占中的元素和运算符用完
class Solution {
public int evalRPN(String[] tokens) {
Stack<Integer> stack=new Stack<>();//栈中存整数
for(int i=0;i<tokens.length;i++){
String s=tokens[i];
if(s.equals("+")||s.equals("-")||s.equals("*")||s.equals("/")){
if(stack.isEmpty()){
return -1;
}else{
int r=stack.pop();//先出的在右
int l=stack.pop();//后出的在左,顺序不能乱
if(s.equals("+")){
stack.push(l+r);
}else if(s.equals("-")){
stack.push(l-r);
}else if(s.equals("*")){
stack.push(l*r);
}else{
stack.push(l/r);
}
}
}else{
stack.push(Integer.valueOf(s));
}
}
return stack.pop();
}
}