理论基础
栈:先进后出
队列:先进先出
tip:
可以学习一下不同语言的底层是怎么实现这两种数据结构的
232.用栈实现队列
python里stack就是list[],只用pop和append,弹出最后的元素和从尾部加入元素
tips:
python 里空列表是false
not list = list.isempty()
class MyQueue:
def __init__(self):
self.stack_in = []
self.stack_out = []
def push(self, x: int) -> None:
self.stack_in.append(x)
def dumpStackin(self) -> None:
if self.stack_out:
return
else:
while self.stack_in:
self.stack_out.append(self.stack_in.pop())
return
def pop(self) -> int:
self.dumpStackin()
return self.stack_out.pop()
def peek(self) -> int:
self.dumpStackin()
res = self.stack_out.pop()
self.stack_out.append(res)
return res
def empty(self) -> bool:
return not (self.stack_in or self.stack_out)
# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()
225. 用队列实现栈
双队列:queue_out只用来备份
单队列:左边出去一个,右边加上一个
tips:
python里的队列用deque()
双向队列deque只用append()和popleft()相当于queue
class MyStack:
# 单队列
def __init__(self):
self.queue = deque()
def push(self, x: int) -> None:
self.queue.append(x)
def getlastiteminQueuein(self) -> None:
for i in range(len(self.queue)-1):
self.queue.append(self.queue.popleft())
def pop(self) -> int:
if not self.queue:
return None
self.getlastiteminQueuein()
return self.queue.popleft()
def top(self) -> int:
if not self.queue:
return None
self.getlastiteminQueuein()
temp = self.queue.popleft()
self.queue.append(temp)
return temp
def empty(self) -> bool:
return not self.queue
# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()
20. 有效的括号
栈的经典题目
先思考分几种情况,再写代码
class Solution:
def isValid(self, s: str) -> bool:
s = list(s)
left_br = []
for element in s:
if element in ['(','[','{']:
left_br.append(element)
else:
if left_br:
right = left_br.pop()
if right == '(' and element != ')':
return False
elif right == '[' and element != ']':
return False
elif right == '{' and element != '}':
return False
else:
return False
if len(left_br) == 0:
return True
else:
return False
1047. 删除字符串中的所有相邻重复项
stack--消消乐
双指针法也可以
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for item in s:
if not stack:
stack.append(item)
else:
if stack[-1] == item:
stack.pop()
else:
stack.append(item)
return ''.join(stack)