系列文章目录
代码随想录算法训练营第一天|数组理论基础,704. 二分查找,27. 移除元素
代码随想录算法训练营第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
代码随想录算法训练营第三天|链表理论基础,203.移除链表元素,707.设计链表,206.反转链表
代码随想录算法训练营第四天|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表II,总结
代码随想录算法训练营第五天|哈希表理论基础,242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
代码随想录算法训练营第六天|454.四数相加II,383. 赎金信,15. 三数之和,18. 四数之和,总结
代码随想录算法训练营第七天|344.反转字符串,541. 反转字符串II,卡码网:54.替换数字,151.翻转字符串里的单词,卡码网:55.右旋转字符串
代码随想录算法训练营第八天|28. 实现 strStr(),459.重复的子字符串,字符串总结,双指针回顾
文章目录
- 系列文章目录
- 理论基础
- 232.用栈实现队列
- 225.用队列实现栈
理论基础
队列是先进先出,栈是先进后出
232.用栈实现队列
题目链接: 232.用栈实现队列
题目内容: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾;int pop() 从队列的开头移除并返回元素;int peek() 返回队列开头的元素;boolean empty() 如果队列为空,返回 true ;否则,返回 false
视频讲解:栈的基本操作! | LeetCode:232.用栈实现队列
核心思想:使用两个栈
class MyQueue:def __init__(self):#in负责push,out负责popself.stack_in=[]self.stack_out=[]def push(self, x: int) -> None:self.stack_in.append(x)def pop(self) -> int:if self.empty():return Noneif self.stack_out: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()self.stack_out.append(ans)return ansdef 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.用队列实现栈
题目链接: 225.用队列实现栈
题目内容: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶;int pop() 移除并返回栈顶元素;int top() 返回栈顶元素;boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
视频讲解:队列的基本操作! | LeetCode:225. 用队列实现栈
方法一:使用两个队列
class MyStack:def __init__(self):self.queue_in=deque()#存所有数据self.queue_out=deque()#pop时使用def push(self, x: int) -> None:self.queue_in.append(x)def pop(self) -> int:if self.empty():return Nonefor i in range(len(self.queue_in)-1):self.queue_out.append(self.queue_in.popleft())self.queue_in,self.queue_out=self.queue_out,self.queue_inreturn self.queue_out.popleft()def top(self) -> int:'''if self.empty():return Nonereturn self.queue_in[-1]'''if self.empty():return Nonefor i in range(len(self.queue_in)-1):self.queue_out.append(self.queue_in.popleft())self.queue_in,self.queue_out=self.queue_out,self.queue_intemp=self.queue_out.popleft()self.queue_in.append(temp)return tempdef empty(self) -> bool:return len(self.queue_in)==0
方法二:只使用一个队列
核心思想:一个队列在模拟栈弹出元素的时候只要将队列头部的元素(除了最后一个元素外) 重新添加到队列尾部,此时再去弹出元素就是栈的顺序了。
class MyStack:def __init__(self):self.que=deque()def push(self, x: int) -> None:self.que.append(x)def pop(self) -> int:if self.empty():return Nonefor i in range(len(self.que)-1):self.que.append(self.que.popleft())return self.que.popleft()def top(self) -> int:'''if self.empty():return Nonereturn self.que[-1]'''if self.empty():return Nonefor i in range(len(self.que)-1):self.que.append(self.que.popleft())temp=self.que.popleft()self.que.append(temp)return tempdef empty(self) -> bool:return len(self.que)==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()