<Stack> (高频)394 ( 高频)224

394. Decode String

 四种情况: 

    1. 数字,把之前有的数字乘以10再加本数字

    2. ' [ ', 入口, 把之前的数字压入栈中并num归零。

    3. ' ] ' ,出口,归零。用dfs先讲栈中的最顶的string都取出,并按添加cnt次。

    4. 字母,压入栈中。 

instanceof string : 判断是不是string类型。

class Solution {
    public String decodeString(String s) {
        int num = 0;
        Stack<Object> stack = new Stack<>();
        
        for(char c : s.toCharArray()){
            //1.number
            if(Character.isDigit(c)){
                num = num * 10 + c - '0';
            }else if(c == '['){//2. [
                stack.push(Integer.valueOf(num));
                num = 0;
            }else if(c == ']'){//3. ]
                    String newstr = dfs(stack);
                    Integer cnt = (Integer)stack.pop();
                    for(int i = 0; i < cnt; i++){
                        stack.push(newstr);
                    }
            }else{//letter
                stack.push(String.valueOf(c));
            }
        }
        return dfs(stack);
    }
    
    private String dfs(Stack<Object> stack){
        Stack<String> tmp = new Stack<>();
        while(!stack.isEmpty() && stack.peek() instanceof String){
            tmp.push((String)stack.pop());
        }
        StringBuilder sb = new StringBuilder();
        while(!tmp.isEmpty()){
            sb.append(tmp.pop());
        }
        return sb.toString();
    }
}

224. Basic Calculator

我们需要一个栈来辅助计算,用个变量sign来表示当前的符号,我们遍历给定的字符串s,如果遇到了数字,由于可能是个多位数,所以我们要用while循环把之后的数字都读进来,然后用sign*num来更新结果res;如果遇到了加号,则sign赋为1,如果遇到了符号,则赋为-1;如果遇到了左括号,则把当前结果res和符号sign压入栈,res重置为0,sign重置为1;如果遇到了右括号,结果res乘以栈顶的符号,栈顶元素出栈,结果res加上栈顶的数字,栈顶元素出栈。

注意当最后一位不为0的时候,要计算出结果。

class Solution {
    public int calculate(String s) {
        Stack<Integer> stack = new Stack<>();
        
        int i = 0;
        int num = 0;
        int sign = 1;
        int subsum = 0;
        while(i < s.length()){
            char c = s.charAt(i);
            if(Character.isDigit(c)){
                num = num * 10 + (c - '0');
            }else if(c == '+'){
                subsum += num * sign;
                sign = 1;
                num = 0;
            }else if(c == '-'){
                subsum += num * sign;
                sign = -1;
                num = 0; 
            }else if(c == '('){
                stack.push(subsum);
                subsum = 0;
                num = 0;
                stack.push(sign);
                sign = 1;
            }else if(c == ')'){
                subsum += num * sign;
                num = 0;
                sign = 1;
                subsum *= stack.pop();
                subsum += stack.pop();
            }
            i++;
        }
        if(num != 0){
            subsum += num * sign;
        }
        return subsum;
    }
}
原文地址:https://www.cnblogs.com/Afei-1123/p/12039976.html