Leetcode227
解决运算器问题,最好工具是栈
栈有利于处理运算顺序(可以临时存储操作数和操作符),方便处理括号
思路分析:
由于乘除运算的优先级高于加减,所以考虑先进行所有的乘除运算,再把乘除运算后的值放回栈中,最后整个表达式的值就等于一系列加减后的值
具体思路:
遍历整个字符串,由于要优先判断乘除,所以需要一个变量preSign来记录每个数字之前的运算符,对于第一个数字之前的运算符视为加号,每次遍历到数字末尾,再根据preSign来决定计算方式
代码实现:
public static int calculate(String s) {
Deque<Integer> stack = new ArrayDeque<>();
//记录前一个符号,初始为'+',方便后续计算
char preSign = '+';
int n = s.length();
//记录运算符号出现前的数字
int num=0;
for (int i =0;i<n;i++){
char c = s.charAt(i);
if (Character.isDigit(c)){
//处理多位数的方式
num = num*10+c-'0'; //c-'0'将字符串形式的转为整数形式
}
//处理不同运算符号
//读到运算符或者遍历到字符串末尾就认为遍历到多位数数字末尾
if (!Character.isDigit(c) && c != ' '|| i == n-1){
switch (preSign){
case '+':
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
stack.push(stack.pop()*num);
break;
default:
stack.push(stack.pop()/num);
break;
}
//将preSign更新为当前遍历的字符
preSign = c;
num = 0;
}
}
int sum = 0;
//遍历完字符串,将栈中元素相加
while (!stack.isEmpty()){
sum += stack.pop();
}
return sum;
}