问题描述
输入一个只包含加减乖除和括号的合法表达式,求表达式的值。其中除表示整除。
输入格式
输入一行,包含一个表达式。
输出格式
输出这个表达式的值。
样例输入
1-2+3*(4-5)
样例输出
-4
数据规模和约定
表达式长度不超过100,表达式运算合法且运算过程都在int内进行。
import java.util.LinkedList;
import java.util.Scanner;
import java.util.Stack;
public class 表达式计算 {
public static void main(String[] args){
LinkedList<Object>queue=new LinkedList<>();
Stack<Character> stack=new Stack<>();
Scanner sc=new Scanner(System.in);
String n=sc.next();
for(int i=0;i<n.length();i++){
char ch=n.charAt(i);
if(ch>='0'&&ch<='9'){
int x=ch-'0';
while(i+1!=n.length()&&(n.charAt(i+1)<='9'&&n.charAt(i+1)>='0')){//如果大于9则是两位数
x=x*10+n.charAt(i+1)-'0';
i++;
}
queue.add(x);
}
else{
if(ch=='('){
stack.push(ch);
}
else if(ch==')'){
while(stack.peek()!='(')
queue.add(stack.pop());
stack.pop();
}else{
while(!stack.empty()&&com(stack.peek())>=com(ch))//比较优先级当前队列中的两个数字之间的运算符
queue.add(stack.pop());
stack.push(ch);
}
}
}
while(!stack.empty())
queue.add(stack.pop());
Stack<Integer>st=new Stack<>();
for(Object ob:queue){
if(ob instanceof Integer)
st.push((Integer)ob);
else{
int a=st.pop();
int b=st.pop();
char c=(Character)ob;
if(c=='+') st.push(a+b);
if(c=='-') st.push(b-a);
if(c=='*') st.push(a*b);
if(c=='/') st.push(b/a);
}
}
System.out.println(st.pop());
}
public static int com(char a){
if(a=='-'||a=='+')
return 1;
if(a=='*'||a=='/')
return 2;
else
return 0;
}
}