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