栈和队列其实也是一种解题思想,和哈希表一样,都是一种思想(而非数据结构)。
理论基础
1、最常见的就是借助列表来实现:
栈就是一个单出口的瓶子:后放进去的先出来;
队列就是排队,先进去先出来。都是对数据的一种整理方式,而不是数据结构。
常涉及的列表的函数:
①append:在列表最后添加一个元素
②pop():弹出列表的最后一个元素
③pop(0):弹出列表的第一个元素
也就是说:①②一起用是栈,①③一起用是队列
在用栈实现队列时,由于是list,如果用pop(0)的话,每次pop(0)都需要后面的每个元素都移动位置,因此时间复杂度较高。所以一般选择用两个栈来实现队列,即用第二个stack来实现倒序。(见232的pop函数部分)
2、也可以用双向队列deque来实现:
Python中,如果用deque的话要先:
from collections import deque
常涉及的deque的函数:
①append:在deque最后添加一个元素
②pop():弹出deque的最后一个元素
③popleft():弹出deque的第一个元素(和list的不同)
也就是说:①②一起用是栈,①③一起用是队列
232.用栈实现队列
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 self.empty():
return None
if self.stack_out:#在之前已经进行了pop(0)操作
return self.stack_out.pop()
else:
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:#只是获取元素,队列位置不要改变
ans = self.pop()#调用pop函数,弹出stack_out的最后一个元素,也就是队列头的第一个元素
self.stack_out.append(ans)#再把ans方慧stack_out,以保持队列不变
return ans
def empty(self) -> bool:
return not (self.stack_in or self.stack_out)#要求in和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()
不知道为啥pop函数的else部分用while写不行,非常奇怪
注意提前判断栈为空的情况
225. 用队列实现栈
from collections import deque
class MyStack:
def __init__(self):
self.deque_in = deque()
def push(self, x: int) -> None:
self.deque_in.append(x)
def pop(self) -> int:
return self.deque_in.pop()#deque是双向队列,pop是从右边弹出,popleft从左边弹出(数据从左至右存储)
def top(self) -> int:
if self.empty():
return None
else:
ans = self.deque_in[-1]#查询deque的最后一个元素
return ans
def empty(self) -> bool:
return len(self.deque_in)==0
# 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()
Python的deque是双向队列,pop是从右边弹出,popleft从左边弹出(数据从左至右存储)
这俩题想着理论完全简单,怎么都做这么久!!!