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; } }