class Solution {
/*用时:25分钟 一开始想用双栈转后缀表达式 没写出来
思路:
只有+ - * / 且表达式中都是正整数,没有括号 且* /优先级高于 + -
可以在遍历过程中计算* /再压栈,+-直接带符号压栈,最后统一计算栈内所有数字之和。
时空复杂度:O(n)
*/
public int calculate(String s) {
Stack<Integer> stk = new Stack<>();
int n = s.length();
int num = 0;
char preSign = '+';
for(int i=0;i<n;i++){
if(Character.isDigit(s.charAt(i))){
num = num*10 + (s.charAt(i)-'0'); //需要优化吗
}
if(!Character.isDigit(s.charAt(i)) && s.charAt(i)!=' ' ||i==n-1){ //遇到符号或最后一个数
switch(preSign){
case('+'):
stk.push(num);
break;
case('-'):
stk.push(-num);
break;
case('*'):
stk.push(stk.pop()*num);
break;
case('/'):
stk.push(stk.pop()/num);
break;
}
num = 0;
preSign = s.charAt(i);
}
}
int ans = 0;
while(!stk.empty()){
ans += stk.pop();
}
return ans;
}
}
class Solution {
/*思路:括号展开 重点是什么时候计算ans ->对于本题是 非数字且非空格 或者 i==n-1
用时:36分钟 一开始16行直接写else 判断条件写不好就出现了问题
时空复杂度:O(n) */
public int calculate(String s) {
Deque<Integer> stk = new LinkedList<>(); //+1/-1表示符号
stk.push(1);
int sign = 1;
int ans = 0,num = 0;
//s = s.replaceAll(" ",""); //去掉空格
int n = s.length();
for(int i=0;i<n;i++){
char c = s.charAt(i);
if(Character.isDigit(c)){
num = num*10 + (c-'0');
}
if(!Character.isDigit(c) && c!=' ' || i==n-1){ //判断条件
ans += sign*num;
switch(c){
case('+'):
sign = stk.peek();
break;
case('-'):
sign = -stk.peek();
break;
case('('):
stk.push(sign);
break;
case(')'):
stk.pop();
break;
}
num = 0;
}
}
return ans;
}
}
TODO
双栈