232
使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈一个输入栈,一个输出栈,这里要注意输入栈和输出栈的关系:初始化两个栈in和out,出队直接就往in压栈,出队先检查out里面有没有元素,有的话out的栈顶就是队首,否则就先把in里面的元素弹出压入到out中。这样就能保证out的栈顶始终都是队首,in的栈顶始终都是队尾。
225
只用一个队列就可以模拟栈了。
入栈操作时,首先获得入栈前的元素个数 n,然后将元素入队到队列,再将队列中的前 n 个元素(即除了新入栈的元素之外的全部元素)依次出队并入队到队列,此时队列的前端的元素即为新入栈的元素,且队列的前端和后端分别对应栈顶和栈底。
由于每次入栈操作都确保队列的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除队列的前端元素并返回即可,获得栈顶元素操作只需要获得队列的前端元素并返回即可(不移除元素)。
20
栈先入后出特点恰好与本题括号排序特点一致,即若遇到左括号入栈,遇到右括号时将对应栈顶左括号出栈,则遍历完所有括号后 stack 仍然为空;
建立哈希表 dic 构建左右括号对应关系:key左括号,value右括号;
算法流程:
如果 c 是左括号,则入栈 push;
否则通过哈希表判断括号对应关系,若 stack 栈顶出栈括号 stack.pop() 与当前遍历括号 c 不对应,则提前返回 false。
1047
充分理解题意后,可以发现,当字符串中同时有多组相邻重复项时,无论是先删除哪一个,都不会影响最终的结果。因此可以从左向右顺次处理该字符串。
而消除一对相邻重复项可能会导致新的相邻重复项出现,如从字符串abba 中删除 bb 会导致出现新的相邻重复项 aa 出现。因此需要保存当前还未被删除的字符。我们只需要遍历该字符串,如果当前字符和栈顶字符相同,将其消去,否则就将其入栈即可。