这道题真是超级棒的stack DFS样板题啊,在这里给本身写个小小的总结node
思路:
想到stack并不难,这种嵌套式通常是DFS的思想,先走到最里面最小的那个括号,而后逐渐回到上一层→上一层。又∵非递归,“BFS queue, DFS stack”。想到用stack并不难
Stack non-recursion DFS template
要点是,处理完以后从新返回stack,才可以回到上一层操做git
这个题具体操做起来真是不少可圈可点的地方,主要是在于String的处理上express
reverse
由于stack的顺序,在这个题中须要每次将每层里的内容reverse。直接StringBuilder的reverse方法不可取:由于是reverse每一层。e.g. 3[ab]2[c]层直接从stack取出其实是cc, ababab将这个reverse后应该获得abababcc。这个时候考虑逆向stack,创建一个stack buffer,将stack pop出来的东西再reverse一个顺序,逆逆得顺app
instanceof
nstanceof是一个很好用的操做符,a instanceof A,判断“一个对象是不是一个类的实例”。做为操做符instanceof不能够直接在最前面!取非(好比>=这种也是),而是用 a instanceof A == false之类的判断ui
复制StringBuilder
add到底append几回,怎么append:直接append add 是不能够的,由于add是在变的,必需要先将第一个add保存起来,相似于dummy node,预先保存queue size这种“锚定”。code
坑
当心一点0[peer], -3[aaa]这种状况啊!对象
代码
public class Solution {递归
public String expressionExpand(String s) { Stack<Object> stack = new Stack<>(); char[] arr = s.toCharArray(); int num = 0; for(char c : arr){ if(Character.isDigit(c)){ num = num * 10 + c - '0'; } else if(c == '['){ stack.push(Integer.valueOf(num)); num = 0; } else if(c == ']'){ popStack(stack); } else{ stack.push(c); } } popStack(stack); return stack.pop().toString(); } private void popStack(Stack<Object> stack){ StringBuilder add = new StringBuilder(); int count; Stack<Object> buffer = new Stack<Object>(); while(!stack.isEmpty() && stack.peek() instanceof Integer == false){ buffer.push(stack.pop()); } while(!buffer.isEmpty()){ add.append(buffer.pop()); } count = stack.isEmpty()? 1 : (Integer) stack.pop(); StringBuilder part = new StringBuilder(add); if(count > 0){ for(int i = 0; i < count - 1; i++) add.append(part); stack.push(add);// reput } }
}it