示例:3 + 4 * 3 + ( 5 - 1) #
解题思路:
本题的难度在于如何区分优先级实现四则运算
首先定义两个栈:操作数栈用来存储操作数,操作符栈用来存储操作符
表达式的求值关键点在于运算符号的优先级,当当前符号的优先级大于栈顶的符号时,直接入栈;若当前符号小于栈顶,则计算当前操作数栈顶的两个元素;若等于,则栈顶符号出栈
优先级的定义看代码
代码:
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;
}
}