Leetcode 232
题目:用栈实现队列
学习资料:代码随想录
初始思路
- 栈a,栈b;栈a的入栈就是相当于入队列;而栈b是将栈a中元素出栈,然后存入到栈b中,这样栈b出栈顺序就是队列出队顺序
- 注意所有的元素都要放到栈b中
学习后
- 判断是否为空,当两个栈都为空时,队列就为空
- top的时候其实可以直接调用pop函数,然后再把pop的元素加入
class MyQueue:
def __init__(self):
self.stack_in = []
self.stack_out = []
def push(self, x: int) -> None:
self.stack_in.append(x)
def pop(self) -> int:
if not self.stack_out:
for i in range(len(self.stack_in)):
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
def peek(self) -> int:
re = self.pop()
self.stack_out.append(re)
return re
def empty(self) -> bool:
return not (self.stack_out or self.stack_in)
Leetcode225
题目:队列实现栈
学习资料:代码随想录
初始思路
- 按照顺序入队列后,假设n个元素,那么将前n-1个元素出队列,然后再次入队列;这样原来最后一个元素就在队头,直接pop就等同于出栈;
- 每次出栈就做出这样的操作
学习后
- top函数,栈的top实际就是队列的尾部元素,直接[-1]返回
- 使用deque()来构建,利用popleft
实现过程
class MyStack:
def __init__(self):
self.queue = deque()
def push(self, x: int) -> None:
self.queue.append(x)
def pop(self) -> int:
if self.queue:
for i in range(len(self.queue)-1):
self.queue.append(self.queue.popleft())
return self.queue.popleft()
def top(self) -> int:
if self.empty():
return None
else:
return self.queue[-1]
def empty(self) -> bool:
return not self.queue
Leetcode20
题目:有效的括号
学习资料:代码随想录
初始思路
- 遇见左括号就入栈,然后遇见右括号再匹配,但是这样逻辑较为复杂
学习后
- 遇见左括号之后,可以入栈右括号,这样对比的时候更容易
- 大致有三种情况会不匹配:
- 第一种就是都遍历结束后,栈中还有剩余元素,说明有多余的左括号。
- 第二种就是还没有遍历结束,但是栈已经空了,说明有多余的右括号。
- 第三种就是左右括号种类不匹配,那就是元素与栈顶元素不同
实现过程
def isValid(self, s: str) -> bool:
stack = []
for i in s:
if i == '(':
stack.append(')')
elif i == '{':
stack.append('}')
elif i == '[':
stack.append(']')
elif not stack or stack[-1] != i:
return False
else:
stack.pop()
if not stack:
return True
else:
return False
Leetcode1047
学习资料: 代码随想录
初始思路
- 遍历字符串,栈为空时,直接入栈;
- 栈不为空:比较元素与栈顶元素
- 相同出栈
- 不同入栈
学习后
- 思路基本一致
- 最后返回剩余字符串,因为利用的list,最后用join连接即可
实现过程
def removeDuplicates(self, s: str) -> str:
stack = []
for i in s:
if stack and i == stack[-1]:
stack.pop()
else:
stack.append(i)
return "".join(stack)
总结
主要是栈和队列的区分和联系;以及栈的应用,一般处理相邻元素的某些情况,栈比较好用。