Leetcode_T227 基本计算器||(双栈解法)
227. 基本计算器 II - 力扣(LeetCode) (leetcode-cn.com)
给你一个字符串表达式 s
,s
由整数和算符 ('+', '-', '*', '/')
组成,中间由一些空格隔开
请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分
整体思路:用两个栈s1和s2,s1用于存储数据,s2用于存储运算符
s1存储数据时,注意对于两位数以上的数据,要循环读取数据
s2存储运算符,因为运算符有优先级,所以当遇到优先级低的,则先将栈内优先级高的运算符拿出与s1中的数据进行运算,并将运算结果返回s1中,再继续读取,就是先将优先级高的计算出结果,再继续进行其他运算
【注意】对于减法、除法,不要将被减数,被除数与减数、除数写反
代码实现:
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
//基本计算器||
//运算优先级-双栈解决
public class Leetcode_T227 {
public int calculate(String s) {
int res = 0;
s = s.replaceAll(" ", "");
Deque<Integer> stack1 = new LinkedList<>();
Deque<Character> stack2 = new LinkedList<>();
Map<Character, Integer> map = new HashMap<>();
map.put('+', 1);
map.put('-', 1);
map.put('*', 2);
map.put('/', 2);
int n = s.length();
for (int i = 0; i < n; i++) {
// 如果是运算符
if (map.containsKey(s.charAt(i))) {
// 借助栈,将优先级高的先进行运算
while (!stack2.isEmpty() && map.get(s.charAt(i)) <= map.get(stack2.peek())) {
Character x = stack2.pop();
int a1 = stack1.pop();
int a2 = stack1.pop();
stack1.push(calculateMethod(a2, x, a1));
}
stack2.push(s.charAt(i));
}
// 如果是数字
else {
int num = 0;
int j = i;
// 循环读取两位数以上的数字
while (j < n && Character.isDigit(s.charAt(j))) {
num = num * 10 + s.charAt(j) - '0';
j++;
}
stack1.push(num);
i = j - 1;
}
}
// 当走完整个循环,如若stack2中还有运算符,继续算完
while (!stack2.isEmpty()) {
Character x = stack2.pop();
int a1 = stack1.pop();
int a2 = stack1.pop();
stack1.push(calculateMethod(a2, x, a1));
}
return stack1.pop();
}
public int calculateMethod(int a, char b, int c) {
switch (b) {
case '+':
return a + c;
case '-':
return a - c;
case '*':
return a * c;
case '/':
return a / c;
}
return -1;
}
}