代码随想录算法训练营day10 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项

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 出现。因此需要保存当前还未被删除的字符。我们只需要遍历该字符串,如果当前字符和栈顶字符相同,将其消去,否则就将其入栈即可。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容