用栈实现+-*/计算器
lmq今天睡觉之前全文背诵一遍
leetcode224.基本计算器
class Solution {private Map<Character,Integer> map = new HashMap<>();//存储数字(如 5、10)private Deque<Character> opQue = new LinkedList<>();//存储运算符private Deque<Integer> numQue = new LinkedList<>();//定义运算符优先级private void compute(){int b = numQue.pollLast();int a = numQue.pollLast();int op = opQue.pollLast();int ans=0;switch(op){case'+': ans=a+b;break; case'-': ans=a-b;break;case'*': ans=a*b;break;case'/': ans=a/b;break;default: break;}numQue.addLast(ans);}public int calculate(String s) {s = s.replaceAll(" ","");map.put('+',0);map.put('-',0);map.put('*',1);map.put('/',1);map.put('(',-1);map.put(')',-1);numQue.addLast(0);//重要 防止负数char[] sArr = s.toCharArray();int n = sArr.length;for(int i=0;i<n;i++){// 截取数字if(sArr[i]>='0' && sArr[i]<='9'){int start = i;while(i<n && sArr[i]>='0' && sArr[i]<='9'){++i;}int num =Integer.parseInt(s.substring(start,i));numQue.addLast(num);}if(i>=n){break;}if(sArr[i]=='('){opQue.addLast(sArr[i]);}else if(sArr[i]==')'){while(opQue.peekLast()!='('){compute();}opQue.pollLast();}else{// 判断是否出现了(- 或者 (+这种情况,那么进行操作数栈补0if(i>0 && sArr[i-1]=='('){numQue.addLast(0);}//如果栈顶运算符优先级 大于等于 当前运算符,则先计算栈顶运算符。if(!opQue.isEmpty() && map.get(opQue.peekLast())>=map.get(sArr[i])){compute();}opQue.addLast(sArr[i]);}}while(!opQue.isEmpty()){compute();}return numQue.peekLast();}
}