给定一个表达式,其中运算符仅包含 +,-,*,/(加 减 乘 整除),可能包含括号,请你求出表达式的最终值。
输入格式
共一行,为给定表达式。
输出格式
共一行,为表达式的结果。
数据范围
表达式的长度不超过 10^5。
输入样例:
(2+2)*(1+1)
输出样例:
8
解题思路:采用栈
import java.util.*;
public class Main {
private static Stack<Integer> num=new Stack<>();//进行初始化 要不然可能为空 存数字
private static Stack<Character> op=new Stack<>();//存字符
//Map 初始化 采用花括号版本
private static Map<Character,Integer> h=new HashMap<>() {
{
put('+',1);
put('-',1);
put('*',2);
put('/',2);
}
};
private static void eval(){
int a=num.peek();
num.pop();
int b=num.peek();
num.pop();
char p=op.peek();
op.pop();
int r=0;
if(p=='+') r=b+a;
if(p=='-') r=b-a;
if(p=='*') r=b*a;
if(p=='/') r=b/a;
num.add(r);
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
String s=scan.next();
for(int i=0;i<s.length();i++){
if(Character.isDigit(s.charAt(i)))//数字入栈
{
int x=0,j=i;
while (j<s.length()&&Character.isDigit(s.charAt(j))){
x=x*10+s.charAt(j)-'0';
j++;
}
i = j - 1;//可能会是12入栈 那么i的位置就要发生变化 i=j-1 之后 还会在加一次 到达正确的位置上
num.add(x);//数字入栈
}
else if(s.charAt(i)=='(')//左括号无优先级,直接入栈
{
op.add(s.charAt(i));//左括号入栈
}
else if(s.charAt(i)==')') //括号特殊,遇到左括号直接入栈,遇到右括号计算括号里面的
{
while(op.peek()!='(')//一直计算到左括号 (2+3*4+5)
eval();//反复计算 直到左括号
op.pop();//左括号出栈
}
else{
while (op.size()!=0&&op.peek()!='('&&h.get(op.peek())>=h.get(s.charAt(i)))// 待入栈运算符优先级低,则先计算
eval();
// op.size()作用 2*4+ *弹出来了 那么op.top为空了 op.size()为0 不满足要求
//op中 有( 优先级如何定义呢
op.add(s.charAt(i));//待入栈优先级高 操作符入栈
}
}
while (op.size()!=0)//剩余的进行计算 19+6还需要计算啊
eval();
System.out.println(num.peek());
}
}