《剑指offer》---两个栈实现队列
本文算法使用python3实现
1.题目描述:
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
时间限制:1s;空间限制:32768K
2.思路描述:
将栈stack1作为存储空间,栈stack2作为临时缓冲区。
入队操作:将元素压入stack1中
出队操作:
(1)判断stack1与stack2是否同时为空,若是,则抛出异常。否则,进行(2)
(2)判断stack2是否为空,若为空,将stack1中的2~n个元素“倒入”stack2中,弹出stack1中的元素。否则,进行(3)
(3)直接弹出stack2中的栈顶元素。
参考示意图:

3.对于以下问题进行以下解释:
(1)在入队时为何不对stack1进行判断是否为空?
答:当stack1不为空时,此时stack1中的元素,从栈底到栈顶元素是按时间先后顺序压入的,此时将元素压入stack1中,如果再进行出队操作时会先判断stack2中是否有元素(参考上面出队操作),而stack2中的元素入队列的时间始终比stack1中的早;就算stack2中没有元素,也会将stack1中的元素先“倒入”stack2中,再出队,此时出队的元素为原始stack1中栈底元素,即最早进入队列的元素。因此,判断与否都不会影响结果。
(2)为何将stack1中的2~n个元素“倒入”stack2中,而不是全部“倒入”?
答:这样可以减少一次压栈操作
4.程序代码:
class Solution:
def __init__(self):
self.stack1 = []
self.stack2 = []
def push(self, node):
'''入队操作'''
self.stack1.append(node)
def pop(self):
'''出队操作'''
# 操作(1)
if len(self.stack1) == 0 and len(self.stack2) == 0:
print('队列为空!')
return
# 操作(3)
if len(self.stack2) != 0:
return self.stack2.pop()
else:
# 操作(2)
while len(self.stack1) > 1:
self.stack2.append(self.stack1[-1])
del self.stack1[-1]
return self.stack1.pop()
《剑指offer》---两个栈实现队列的更多相关文章
- 剑指Offer——Java实现栈和队列的互模拟操作
剑指Offer--Java实现栈和队列的互模拟操作 栈模拟队列 题目:JAVA实现用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 思路:其实就是把队列正常入 ...
- 《剑指offer》-双栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 很基本的STL容器操作了,应该可以1A的,但是忘记返回值的时候,clang的报错感觉并不友好啊.. cl ...
- 剑指offer-用两个栈实现队列05
class Solution: def __init__(self): self.stackpush=[] self.stackpop=[] def push(self, node): # write ...
- 剑指offer-用两个栈实现队列-栈和队列-python
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. # -*- coding:utf-8 -*- class Solution: def __init_ ...
- 剑指Offer9——使用双栈模拟队列
剑指Offer9--使用双栈模拟队列 队列Queue是具有FIFO(First in First out)特性的数据结构,栈Stack是具有LIFO(后进先出)特性的数据结构.下面提供一种思路使用双栈 ...
- 剑指offer-用两个栈来实现一个队列-队列与栈-python
用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路:使用两个栈,stackA 用来接收node stackB 用来接收 stackA 的出栈 # -*- cod ...
- 剑指Offer 两个链表的第一个公共结点
题目描述 输入两个链表,找出它们的第一个公共结点. 思路: 题目说的很笼统,应该是有2个链表,找出公共点,第一个公共点后面的链表是共同所有的.可以用map做,直接检测map里有没有出现这个节点. ...
- 剑指Offer——两个链表的第一个公共结点
题目描述: 输入两个链表,找出它们的第一个公共结点. 分析: 设置两个指针,分别从两个链表的头部开始往后遍历. 谁遍历完自己本身的,就从另一个链表开始遍历,这样大家到达第一个公共结点的时候便会相遇. ...
- 剑指Offer - 两个链表第一个公共节点
https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&tPage= ...
- 用js刷剑指offer(两个链表的第一个公共结点)
题目描述 输入两个链表,找出它们的第一个公共结点. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ fun ...
随机推荐
- 02-HTTP的请求方法以及响应状态码
1. HTTP的请求方法以及响应状态码 1.1. 请求方法 http请求方法有GET.POST.PUT.HEAD.DELETE.OPTIONS.TRACE.CONNECT.当然上述方法是基于HTT ...
- oracle 用户尝试登录失败锁定策略及修改
-- 修改密码的有效期策略, 永不过期SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;Profile altered ...
- Android编译命令
目录 说在前面 编译流程 编译指令 代码编译 代码检索 其他指令 说在前面 从最开始接触Android系统开始,每次进行代码编译都需要网上搜索编译指令.后来大致熟悉了Android的编译体系,加深了对 ...
- python 两个面试题
1.下面程序的运算结果是什么?? class Parent: def func(self): print("In Parent func") def __init__(self): ...
- docker-compose入门示例:一键部署 Nginx+Tomcat+Mysql
整体环境配置 整体环境的配置,如果一个一个 Dockerfile 去写,那么是相当麻烦的,好在 Docker 有一个名为 Docker-Compose 的工具提供,我们可以使用它一次性完成整体环境的配 ...
- UPDATE_ENTITY実行
1.クラスZCL_Z_EPM_RKT_DPC_EXTのクラスビルダ画面から.SALESORDERS_UPDATE_ENTITYメソッドを選択し.右クリックで.再定義をクリックします. 2.以下のソース ...
- 成都Uber优步司机奖励政策(2月20日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 苏州Uber优步司机奖励政策(1月11日~1月17日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- SAX-xml解析
<?xml version="1.0" encoding="UTF-8"?><bookstore> <book id=" ...
- Kotlin的密封(Sealed)类:超强的枚举(KAD 28)
作者:Antonio Leiva 时间:Jun 27, 2017 原文链接:https://antonioleiva.com/sealed-classes-kotlin/ Kotlin的封装类是Jav ...