解题思路:
本题的难度在于如何区分优先级实现四则运算
首先定义两个栈:操作数栈用来存储操作数,操作符栈用来存储操作符
表达式的求值关键点在于运算符号的优先级,当当前符号的优先级大于栈顶的符号时,直接入栈;若当前符号小于栈顶,则计算当前操作数栈顶的两个元素;若等于,则栈顶符号出栈
优先级的定义看代码
代码:
package practise;
import java.io.IOException;
import java.util.Stack;
public class EvaluateExpression {
// 定义两个栈
private static Stack stackOpr = new Stack<>();
private static Stack stackNum = new Stack<>();
// 计算表达式
public static void main(String [] args) throws IOException {
char c = (char)System.in.read();
stackOpr.push("#");
while(c != "#" || stackOpr.peek() != "#"){
if(isNum(c)){
stackNum.push(c - 48);
c = (char)System.in.read();
}else{
switch(isPrior(c)){
case "
int a = stackNum.pop();
int b = stackNum.pop();
stackNum.push(operation(b, a, stackOpr.pop()));
break;
case ">":
stackOpr.push(c);
c = (char)System.in.read();
break;
case "=":
stackOpr.pop();
c = (char)System.in.read();
break;
}
}
}
System.out.println(stackNum.pop());
}
// 判断字符的优先级
static char isPrior(char c){
char c1 = stackOpr.peek();
if(c == "+" || c == "-"){
if(c1 == "+" || c1 == "-" || c1 == "*" || c1 == "/" || c1 == ")")
return "
if(c1 == "(" || c1 == "#")
return ">";
}
if(c == "*" || c == "/"){
if(c1 == "*" || c1 == "/" || c1 == ")")
return "
if(c1 == "+" || c1 == "-" || c1 == "#" || c1 == "(")
return ">";
}
if(c == "("){
return ">";
}
if(c == ")"){
if(c1 == "(")
return "=";
else
return "
}
if(c == "#"){
if(c1 == "#")
return "=";
else
return "
}
return 0;
}
// 计算当前表达式
static int operation(int a, int b, char c){
switch(c){
case "+":
return a + b;
case "-":
return a - b;
case "*":
return a * b;
case "/":
return a / b;
}
return 0;
}
// 判断是否为数字
static boolean isNum(char c){
if(c == "+" || c == "-" || c == "*" || c == "/" || c == "(" || c == ")" || c =="#"){
return false;
}
return true;
}
}