Evaluate the value of an arithmetic expression in Reverse Polish Notation.
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6大家其实百度一下“逆波兰表达式”就可以了~
(1)首先构造一个运算符栈,此运算符在栈内遵循越往栈顶优先级越高的原则。
(2)读入一个用中缀表示的简单
算术表达式,为方便起见,设该简单算术表达式的右端多加上了优先级最低的特殊符号“#”。
(4)如果不是数字,该字符则是运算符,此时需比较优先关系。
做法如下:将该字符与运算符栈顶的运算符的优先关系相比较。如果,该字符优先关系高于此运算符栈顶的运算符,则将该运算符入栈。倘若不是的话,则将栈顶的运算符从栈中弹出,直到栈顶运算符的优先级低于当前运算符,将该字符入栈。
(5)重复上述操作(3)-(4)直至扫描完整个简单
算术表达式,确定所有字符都得到正确处理,我们便可以将中缀式表示的简单算术表达式转化为逆波兰表示的简单算术表达式。
import java.util.Stack;
public class EvaluateReversePolishNotation {
public static void main(String args[]){
EvaluateReversePolishNotation erp = new EvaluateReversePolishNotation();
String[] tokens = {"3", "-4", "+"};
System.out.println(erp.evalRPN(tokens));
}
public int evalRPN(String[] tokens) {
Stack<Integer> stack = new Stack<Integer>();
int input;
for(int i=0;i<tokens.length;i++){
if(tokens[i].charAt(0)>='0'&&tokens[i].charAt(0)<='9')
{input = Integer.parseInt(tokens[i]);
stack.push(input);
}
else if(tokens[i].length()>1&&tokens[i].charAt(0)=='-'){
input = Integer.parseInt(tokens[i]);
stack.push(input);
}
else if(tokens[i].charAt(0)=='+')
stack.push(stack.pop()+stack.pop());
else if(tokens[i].charAt(0)=='-'){
int tmp = stack.pop();
stack.push(stack.pop()-tmp);
}
else if(tokens[i].charAt(0)=='/'){
int tmp = stack.pop();
stack.push(stack.pop()/tmp);
}
else if(tokens[i].charAt(0)=='*')
stack.push(stack.pop()*stack.pop());
}
return stack.peek();
}
}