我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/basic-calculator/description/
题目描述:
知识点:栈
思路:中缀表达式转后缀表达式+后缀表达式的计算
如何将中缀表达式转化成后缀表达式?
从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。
如何计算后缀表达式的值?
准备一个数字栈。从左到右扫描后缀表达式,如果是数字,放入数字栈。如果是符号,从数字栈中弹出两个数字,第一个取出的数字为右运算数,第二个为左运算数,进行运算。然后将结果放进数字栈中。如此反复,直到读完整个表达式后,留在数字栈中的那个数字就是最终结果。
时间复杂度和空间复杂度均是O(n),其中n为所给字符串表达式的长度。
JAVA代码:
public class Solution {
public int calculate(String s) {
StringBuilder stringBuilder = new StringBuilder();
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); ) {
Character temp = s.charAt(i);
if(temp >= '0' && temp <= '9'){
int[] result = findNextNumAndIndex(s, i);
stringBuilder.append(result[0]);
stringBuilder.append(" ");
i = result[1];
}else if(temp == '('){
stack.push(temp);
i++;
}else if(temp == '+' || temp == '-'){
if(!stack.isEmpty()){
while(!stack.isEmpty()){
Character item = stack.pop();
if(item == '('){
stack.push(item);
break;
}else{
stringBuilder.append(item);
stringBuilder.append(" ");
}
}
}
stack.push(temp);
i++;
}else if(temp == ')'){
Character item = stack.pop();
while(item != '('){
stringBuilder.append(item);
stringBuilder.append(" ");
item = stack.pop();
}
i++;
}else{
i++;
}
}
while(!stack.isEmpty()){
stringBuilder.append(stack.pop());
stringBuilder.append(" ");
}
String[] strings = stringBuilder.toString().split(" ");
Stack<Integer> numStack = new Stack<>();
for (int i = 0; i < strings.length; i++) {
if(strings[i].charAt(0) == '+'){
int num1 = numStack.pop();
int num2 = numStack.pop();
numStack.push(num2 + num1);
}else if(strings[i].charAt(0) == '-'){
int num1 = numStack.pop();
int num2 = numStack.pop();
numStack.push(num2 - num1);
}else{
numStack.push(Integer.parseInt(strings[i]));
}
}
return numStack.pop();
}
private int[] findNextNumAndIndex(String s, int index){
int num = 0;
int i = index;
for (; i < s.length(); i++) {
if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
num = num * 10 + s.charAt(i) - '0';
}else{
break;
}
}
int[] result = new int[2];
result[0] = num;
result[1] = i;
return result;
}
}
LeetCode解题报告: