栈与队列之间的相互实现,是面试中的经典试题。

两个栈实现一个队列

入队:元素进栈A

出队:先判断栈B是否为空,为空则将栈A中的元素 pop 出来并 push 进栈B,再栈B出栈,如不为空则栈B直接出栈

复杂度分析:

这样用两个栈实现一个队列,入队的复杂度为O(1),出队的复杂度则变为O(n)。

而直接用 python 的单个列表实现队列,以列表首作为队列尾,则入队用insert,复杂度为O(n),出队用pop,复杂度为O(1)。(列表首,即列表中下标为0的元素)

实现:就以列表作为栈的底层实现,只要保证后进先出的约束就是栈。这里只实现入队和出队两个操作。

class Queue:def __init__(self):self.stockA=[]self.stockB=[]def push(self, node):self.stockA.append(node)def pop(self):if self.stockB==[]:if self.stockA==[]:return Noneelse:for i in range(len(self.stockA)):self.stockB.append(self.stockA.pop())return self.stockB.pop()

可以用简单的实例来测试一下是否成功实现了队列

if __name__=='__main__':times=5testList=list(range(times))testQueue=Queue()for i in range(times):testQueue.push(testList[i])print(testList)for i in range(times):print(testQueue.pop(),',',end='')   #end=''可以让 print 输出不换行
#输出结果:先进先出
[0, 1, 2, 3, 4]
0 ,1 ,2 ,3 ,4 ,

附上牛客网上剑指offer的试题:用两个栈来实现队列

两个队列实现一个栈

进栈:元素入队列A

出栈:判断如果队列A只有一个元素,则直接出队。否则,把队A中的元素出队并入队B,直到队A中只有一个元素,再直接出队。为了下一次继续操作,互换队A和队B。

复杂度分析:

第一种形式:如果以列表尾作为队尾,直接用 append 插入新元素,复杂度为O(1)。

再用pop去弹出队首,也就是列表第0个元素,弹出后插入到另一个队列中。第一次 pop,需要移动列表后面n-1个元素,第二次 pop,需要移动后面n-2个元素……直到最后只剩最后一个元素,直接出队。

复杂度:(n-1)+(n-2)+……+1=O(n^2)。

第二种形式:如果以列表首作为队尾,用 insert 插入新元素,需要移动后面的元素,复杂度则为O(n)。

再用pop去弹出队首,也就是列表最后一个元素,弹出后插入到另一个队列中。这样操作虽然弹出元素的复杂度为O(1),但再插入另一个队列的复杂度则为O(n),因为要连续弹出n-1个元素,则需要连续插入n-1个元素,最后的复杂度同样会是O(n^2)。

因此选择第一种形式。

而直接用python的一个列表实现栈,以列表尾为栈首,则出栈和进栈的复杂度都为O(1)。

实现:就以列表作为队列的底层实现,只要保证先进先出的约束就是队列。这里只实现进栈和出栈两个操作。

class Stock:def __init__(self):self.queueA=[]self.queueB=[]def push(self, node):self.queueA.append(node)def pop(self):if len(self.queueA)==0:return Nonewhile len(self.queueA)!=1:self.queueB.append(self.queueA.pop(0))self.queueA,self.queueB=self.queueB,self.queueA #交换是为了下一次的popreturn self.queueB.pop()

可以用简单的实例来测试一下是否成功实现了栈

if __name__=='__main__':times=5testList=list(range(times))testStock=Stock()for i in range(times):testStock.push(testList[i])print(testList)for i in range(times):print(testStock.pop(),',',end='')
#输出结果:后进先出
[0, 1, 2, 3, 4]
4 ,3 ,2 ,1 ,0 ,

Python剑指offer之两个栈实现一个队列-两个队列实现一个栈相关推荐

  1. LEETCODE | PYTHON | 剑指 Offer 58 - Ⅱ | 左旋转字符串

    LEETCODE | PYTHON | 剑指 Offer 58 - Ⅱ | 左旋转字符串 1. 题目 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作 ...

  2. 剑指offer第41题 和为s的两个数

    剑指offer第41题 和为s的两个数 #include<iostream> using namespace std;bool sumk(int*list,int length,int*n ...

  3. python连续质数计算_GitHub - xxqfft/AlgorithmsByPython: 算法/数据结构/Python/剑指offer/机器学习/leetcode...

    尝试用Python实现一些简单的算法和数据结构 之前的算法和数据结构基本都是用Swift写的,现在尝试用Python实现一些简单的算法和数据结构. update 20160704 准备加入<剑指 ...

  4. python 剑指offer 学习之路(二)

    剑指offer 学习之路 合并两个排序的链表 树的子结构 顺时针打印矩阵 包含min函数的栈 从上往下打印二叉树 二叉搜索树的后序遍历序列 二叉树中和为某一值的路径 复杂链表的复制 数组中出现次数超过 ...

  5. 剑指Offer - 面试题57. 和为s的两个数字(双指针)

    1. 题目 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,则输出任意一对即可. 示例 1: 输入:nums = [2,7,11,15], ta ...

  6. 剑指offer面试题[41]-和为s的两个数VS和为s的连续正数序列

    题目描述 题目1: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输 ...

  7. 剑指offer面试题57. 和为s的两个数字(双指针)

    题目描述 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,则输出任意一对即可. 思路 详见链接 代码 class Solution:def tw ...

  8. [剑指offer][JAVA]面试题第[09]题[用两个栈实现队列][LinkedList]

    [问题描述][简单] 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元 ...

  9. python剑指offer 包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). # -*- coding:utf-8 -*- class Solution:def _ ...

  10. 链表 python 牛客_牛客网《剑指offer》之Python2.7实现:合并两个排序的链表

    题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 思路 依次遍历两个链表,比较两个链表的元素,采用尾插法,小的先插入链表,大的后插入链表 代码# ...

最新文章

  1. 给 Windows 驱动程序安装提速
  2. 通过mtd读写flash_关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题...
  3. 第14章WEB14-JDBC案例篇
  4. Vue + Spring Boot——axios使用GET以参数的方式传递对象到SpringMVC解决方案
  5. 【Java从0到架构师】MyBatis - 查询
  6. java编译通过,运行却提示找不到或无法加载主类
  7. python模拟超市抹零_Python基础练习二超市存包柜模拟
  8. Jira 破解版 Docker 部署
  9. sigmoid函数特性
  10. 巫师3储物箱在哪_巫师三孤岩宝箱在哪 | 手游网游页游攻略大全
  11. 邮件服务器的功能以及相关工作原理
  12. 异步电机无差拍模型预测电流控制(MPCC)
  13. 国产etl 与 ODI
  14. android x86 鼠标指针,x86中断完全版
  15. 基于JAVA博物馆交流平台计算机毕业设计源码+系统+lw文档+部署
  16. 数据分析-数据分析报告
  17. 阿里巴巴Java开发手册及Java代码规约扫描eclipse插件
  18. 全国计算机竞赛保送清华,连夺奥赛金牌 高二男生保送清华、北大
  19. 字节跳动大数据研发面试——自我反省
  20. 穷站长(QIONGZZ.com) - 国内最大的免费空间站,国内最便宜最稳定的空间

热门文章

  1. 几个文件vtp格式转stl格式
  2. <永洪BI>慢查询记录
  3. markdown语法
  4. C语言程序设计--教师信息管理系统
  5. [Qualcomm][MSM8937] MSM89XX平台上加载modem固件失败
  6. java实现生命游戏
  7. 计算机二级题百度云,题库吧百度_计算机二级 office 题库 百度云 谢谢_淘题吧
  8. oppo系统android版本下载,oppo手机助手
  9. mouseover 和 mouseenter的区别
  10. c++ fbxsdk安装配置_Linux上安装软件 - coydone