第五章 栈与队列part01
理论基础
python中栈与队列的操作由列表和collections库中的deque实现
232.用栈实现队列

感觉都是列表实现栈和队列,操作还是列表的操作
push函数:将一个元素x添加到队尾。这里用列表的append扩展一个元素到尾部
pop函数:从队列开头移除并返回元素。首先考虑是否有元素,也即队列是否空。这里用了两个栈实现队列,stack1用来push新的元素,当需要一处队列开头的元素时,对stack1的所有元素进行pop(),并将这些元素append到stack2中,这样顺序回复,去除第一个元素即可。
peek函数,类似的思路,结束之后返回列表的最后一个元素,也即-1
判断队列为空,看stack1和stack2
python
class MyQueue:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, x: int) -> None:
self.stack1.append(x)
def pop(self) -> int:
if not self.stack2:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
def peek(self) -> int:
if not self.stack2:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2[-1]
def empty(self) -> bool:
if not self.stack1 and not self.stack2:
return True
else:
return False
# 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. 用队列实现栈

push函数:将一个元素x添加到队尾。这里用列表的append扩展一个元素到尾部
pop函数:从队列开头移除并返回元素。首先考虑是否有元素,也即队列是否空。这里用了一个队列实现栈,也即从头部pop出length-1个数到队列尾部,这样之前的尾部就成为了头部。
peek函数,类似的思路,结束之后返回列表的最后一个元素,也即-1
判断队列为空
python
class MyStack:
def __init__(self):
self.queue = []
def push(self, x: int) -> None:
self.queue.append(x)
def pop(self) -> int:
if self.queue is None:
return False
else:
length = len(self.queue)
for i in range(length):
self.queue.append(self.queue.pop())
return self.queue.pop()
def top(self) -> int:
if self.queue is None:
return False
else:
length = len(self.queue)
for i in range(length):
self.queue.append(self.queue.pop())
return self.queue[-1]
def empty(self) -> bool:
if self.queue:
return False
else:
return True
# 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. 有效的括号

对称的思路,每传进来一个左括号,就向栈里面添加一个右括号,如果传进的不是左括号,就拿栈中第一个元素比较,相同即消去,不相同说明出错了。
这里要想好无效字符串的情况:
多一个会错,也即最后栈空了而字符串没有遍历完 ({}))
少一个会错,也即遍历完字符串栈还不空 ({}
不匹配也会错,也及判断条件 ({)}
python
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for i in range(len(s)):
if s[i] == '(':
stack.append(')')
elif s[i] == '[':
stack.append(']')
elif s[i] =='{':
stack.append('}')
else:
if s[i] == stack[-1]:
stack.pop()
else:
return False
if stack:
return False
else:
return True
1047. 删除字符串中的所有相邻重复项

对称的思路,每传进来一个字母a,就向栈里面添加一个相同字母a,每传进一个字母,就拿栈中第一个元素比较,相同即消去,不相同说明出错了。
python
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for i in range(len(s)):
if stack and s[i] == stack[-1]:
stack.pop()
else:
stack.append(s[i])
return ''.join(stack)
总结
python里栈和队列似乎都没有具体的实现(collections.deque之外),这里更多的是想清楚思路做题,期待