栈与队列—— 232.用栈实现队列 ; 225. 用队列实现栈
文档链接:代码随想录
做题感悟:
- python自带的栈相关的操作:
stack=[]
定义一个栈
list.append(x)=push(x)
list.pop()=pop()
list=is not empty
如果栈内有元素,返回true,反之返回false- python自带的队列操作。
queue=deque()
定义一个队列
queue[-1]
可以访问到队列的最后一个元素
其余操作与栈一致。
题目一:232.用栈实现队列 ——37min
- 一些基本操作,注意记住python使用栈的方法
- python 里列表就是栈,pop出去的元素是最后一个元素。
class MyQueue:
def __init__(self):
self.stack_in = [] # python类中的自定义参数以及使用该参数时,要加self前缀,
self.stack_out = []
def push(self, x: int) -> None:
# 自定义函数,要在参数栏加self,调用函数时要用self做前缀
self.stack_in.append(x)
return
def pop(self) -> int:
if self.empty(): # 如果队列为空
return None
if self.stack_out: # 如果出栈为不空,直接pop
print(self.stack_in)
return self.stack_out.pop()
else:
for i in range(len(self.stack_in)):
# 栈本身是列表,但是一遍遍历栈,一遍pop元素,会导致元素遍历不充分
self.stack_out.append(self.stack_in.pop())
print(self.stack_out)
return self.stack_out.pop()
def peek(self) -> int:# 只是查找,不能随便pop
if self.empty():
return None
ans=self.pop()
self.stack_out.append(ans)# pop出来记得放回去
return ans
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. 用队列实现栈——20min
- 队列是一端进,另一端出,但是栈是同进同出。
- 因此,需要改变队列的出去方向,可以pop后,在继续放入队列,直到遍历到队列的最后一个元素。这样就可以只使用一个队列空间,实现pop()。
class MyStack:
def __init__(self):
self.que = deque()
def push(self, x: int) -> None:
self.que.append(x)
def pop(self) -> int:
if len(self.que)==0:
return None
for i in range(len(self.que)-1):
self.que.append(self.que.pop())
return self.que.pop()
def top(self) -> int:
return self.que[-1] # 返回列表的最后一位。
def empty(self) -> bool:
return len(self.que) == 0