栈与队列理论基础
文章链接:代码随想录
文章讲的主要是讲两者的底层实现。
简单来说,栈和队列都是特殊的线性表
如图所示,栈是先进后出(第一个进去最后一个出来)
如图所示,队列是先进先出(第一个进去第一个出来)
力扣题部分
232.用栈实现队列
题目链接:. - 力扣(LeetCode)
题面:
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作,包括push
、pop
、peek
、empty。
所有操作都是有效的(例如,一个空的队列不会调用 pop 或者 peek 操作)。
思路:
一个栈负责输入,另一个负责输出,在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。如果进栈和出栈都为空的话,说明模拟的队列为空了。
这么讲可能看着有点懵,我制作了一个视频动画演示可以帮助理解。
232.用栈实现队列(day10)演示视频
代码实现:
225. 用队列实现栈
题目链接:. - 力扣(LeetCode)
题面:
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
思路(一个队列):
事实上一个队列就能解决此问题。 输入没什么好说的,放到队列里,输出前弹出并放入元素,总共操作q.size()次后再弹出原本队列里最后一个数实现栈功能。
代码实现:
20. 有效的括号
题目链接:. - 力扣(LeetCode)
题面:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
思路(栈):
括号匹配可是栈的拿手好戏,遍历整个字符串,每遇到左括号就入栈,遇到右括号就看栈顶的左括号是否与之匹配,是的话就弹出栈顶元素,不是就肯定return false了,遍历完成记得看栈是否为空,不空意味着左括号没匹配完,也是要return false 的,反之return true。
我的括号匹配代码将所有括号放进字符数组里了,然后通过下标判断括号的性质。
代码实现:
1047. 删除字符串中的所有相邻重复项
题目链接:. - 力扣(LeetCode)
题面:
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
思路(栈):
依旧是栈的应用,和括号匹配类似。遍历一遍字符串,如果栈空或者栈顶于遍历元素不同,就压入栈,如果相同就把相同元素弹出(遍历元素不入栈),直到最后将栈元素逆序输出即可。
为什么是逆序呢?由于栈的先进后出导致出来的字符串会是完全反的,需要一次反转或者逆序加入空串中再输出。
代码实现: