问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
思路:根据中缀表达式求后缀表达式,然后利用后缀表达式求值。
import java.util.Collections;
import java.util.Scanner;
import java.util.Stack;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
String str = scan.next();
System.out.println(cal(str));
}
private static int cal(String str) {
Stack<String> postFixStack = getPostFixStack(str);
Stack<Integer> res = new Stack<Integer>();
Collections.reverse(postFixStack);
while(!postFixStack.isEmpty()){
String s = postFixStack.pop();
if(!isOperate(s.charAt(0))){
res.push(Integer.parseInt(s));
}else{
int a = res.pop();
int b = res.pop();
res.push(operate(b,s,a));
}
}
return res.pop();
}
private static Integer operate(int a, String s, int b) {
if("+".equals(s)){
return a+b;
}else if("-".equals(s)){
return a-b;
}else if("*".equals(s)){
return a*b;
}else{
return a/b;
}
}
private static Stack<String> getPostFixStack(String str) {
Stack<String> ch = new Stack<String>();
Stack<String> stack = new Stack<String>();
String number = "";
for(int i=0;i<str.length();i++){
char c = str.charAt(i);
if(c>='0'&&c<='9'){
number+=c;
continue;
}
if(!number.equals("")){
stack.push(number);
number = "";
}
if(c=='('){
ch.push(c+"");
}else if(isOperate(c)){
while(!ch.isEmpty()){
String s = ch.pop();
if(isAbove(c+"",s)){
ch.push(s);
break;
}else{
stack.push(s);
}
}
ch.push(c+"");
}else if(c==')'){
while(!ch.isEmpty()){
String s = ch.pop();
if(!"(".equals(s)){
stack.push(s);
}else{
break;
}
}
}
}
while(!ch.isEmpty()){
stack.push(ch.pop());
}
return stack;
}
private static boolean isAbove(String op1, String op2) {
// TODO Auto-generated method stub
if("(".equals(op2))
return true;
else if(("*".equals(op1)||"/".equals(op1))&&("+".equals(op2)||"-".equals(op2)))
return true;
return false;
}
private static boolean isOperate(char c) {
// TODO Auto-generated method stub
return c=='+'||c=='-'||c=='*'||c=='/';
}
}