public static void ExpEvaluation(String str) {
Stack<Integer> OVS = new Stack<>();
Stack<Character> OPTR = new Stack<>();
int i = -1;
Character ch = str.charAt(0);
while (ch != '#' || OPTR.peek() != '#') {
ch = str.charAt(++i);
if (Character.isDigit(ch)){
OVS.push(Integer.parseInt(String.valueOf(ch)));
}
else {
if (OPTR.isEmpty()){
OPTR.push(ch);
}
else {
while (!OPTR.isEmpty() && !Compare(ch, OPTR.peek())) { // OVS退栈两个数,OPTR退栈一个符号,操作结果入栈OVS
Integer x1 = OVS.peek();
OVS.pop();
Integer x2 = OVS.peek();
OVS.pop();
Integer exec = Execute(x2, x1, OPTR.peek());
OPTR.pop();
OVS.push(exec);
}
OPTR.push(ch);
}
}
}
System.out.println(OVS);
}
Execute()
根据操作符ch计算x1与x2的运算结果
private static Integer Execute(Integer x1, Integer x2, Character ch) {
Integer re = null;
switch (ch){
case '+':
re = x1 + x2; break;
case '-':
re = x1 - x2; break;
case '*':
re = x1 * x2; break;
case '/':
re = x1 / x2; break;
}
return re;
}
Compare()
比较操作符ch与pe优先级关系
‘* /’ > ‘+ -’ > ‘#’
private static boolean Compare(Character ch, Character pe) {
return (
(ch == '*' || ch == '/') &&
(pe == '+' || pe == '-')
) && (ch != '#');
}