我的LeetCode代码仓:https://github.com/617076674/LeetCode

原题链接:https://leetcode-cn.com/problems/basic-calculator/description/

题目描述:

LeetCode224——基本计算器

知识点:栈

思路:中缀表达式转后缀表达式+后缀表达式的计算

如何将中缀表达式转化成后缀表达式?

从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级不高于栈顶符号则栈顶元素依次出栈并输出,并将当前符号进栈,一直到最终输出后缀表达式为止。

如何计算后缀表达式的值?

准备一个数字栈。从左到右扫描后缀表达式,如果是数字,放入数字栈。如果是符号,从数字栈中弹出两个数字,第一个取出的数字为右运算数,第二个为左运算数,进行运算。然后将结果放进数字栈中。如此反复,直到读完整个表达式后,留在数字栈中的那个数字就是最终结果。

时间复杂度和空间复杂度均是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解题报告:

LeetCode224——基本计算器

 

相关文章: