栈和队列是两种基本的数据结构,同为容器类型,队列是先进先出,栈是先进后出。


栈提供 push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。

栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。

对于stack我们可以使用python内置的list实现,因为list是属于线性数组,在末尾插入和删除一个元素所使用的时间都是O(1),这非常符合stack的要求。当然,我们也可以使用链表来实现。

stack的实现代码(使用python内置的list),实现起来是非常的简单,就是list的一些常用操作。

class Stack(object):def __init__(self):self.stack = []def push(self, value):    # 进栈self.stack.append(value)def pop(self):  #出栈if self.stack:self.stack.pop()else:raise LookupError('stack is empty!')def is_empty(self): # 如果栈为空return bool(self.stack)def top(self): #取出目前stack中最新的元素return self.stack[-1]

队列


队列是一种先进先出的(First In First Out)的线性表,简称FIFO。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,总是在队列最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后。

定义一个头结点,左边指向队列的开头,右边指向队列的末尾,这样就可以保证我们插入一个元素和取出一个元素都是O(1)的操作,使用这种链表实现stack也是非常的方便。实现代码如下:

class Head(object):def __init__(self):self.left = Noneself.right = Noneclass Node(object):def __init__(self, value):self.value = valueself.next = Noneclass Queue(object):def __init__(self):#初始化节点self.head = Head()def enqueue(self, value):#插入一个元素newnode = Node(value)p = self.headif p.right:#如果head节点的右边不为None#说明队列中已经有元素了#就执行下列的操作temp = p.rightp.right = newnodetemp.next = newnodeelse:#这说明队列为空,插入第一个元素p.right = newnodep.left = newnodedef dequeue(self):#取出一个元素p = self.headif p.left and (p.left == p.right):#说明队列中已经有元素#但是这是最后一个元素temp = p.leftp.left = p.right = Nonereturn temp.valueelif p.left and (p.left != p.right):#说明队列中有元素,而且不止一个temp = p.leftp.left = temp.nextreturn temp.valueelse:#说明队列为空#抛出查询错误raise LookupError('queue is empty!')def is_empty(self):if self.head.left:return Falseelse:return Truedef top(self):#查询目前队列中最早入队的元素if self.head.left:return self.head.left.valueelse:raise LookupError('queue is empty!')

参考链接:https://www.cnblogs.com/yiduobaozhiblog1/p/9272556.html

栈和队列在python中的实现相关推荐

  1. 栈和队列(python代码)

    1.栈[Stack]:是只限定在表的一端进行数据插入和删除的线性表 2.队列[Queue ]:是在表的一端进行数据插入,在表的另一端进行数据的删除的线性表 3.栈和队列都是线性表:线性表只是一种线性结 ...

  2. 数据结构 02-栈概念、Python 中使用列表 list 实现栈

    目      录 1. 栈简介 1.1 栈的概念 1.2 栈的类型 1.2.1 是否能动态增长 1.2.2 栈的实现方式 2. Python 中使用列表 list 实现栈 2.1 栈的常规操作 2.2 ...

  3. 算法与数据结构 -- 栈与队列(四)

    栈与队列定义了数据的操作 一.栈 栈是一种先入先出的数据结构.可以用顺序表实现,也可以用链表实现 栈操作 判断是否为空 压栈.入栈push 出栈 pop 返回栈顶元素 peek 栈的元素个数 # co ...

  4. 【LeetCode刷题】栈与队列专题

    前言:之前对栈与队列一直停留在表层概念的理解上,不知道怎么用,借刷题的机会来深入理解一下. 文章目录 20 有效括号 1047. 删除字符串中的所有相邻重复项 栈版本 双指针版本 150. 逆波兰表达 ...

  5. 大话数据结构-栈与队列

    文章知识点来至于大话数据结构里边章节知识, 这篇主要介绍栈与队列在计算机中存储形式, 以及在某些算法领域中对栈和队列的相关应用.章节最后介绍了著名的逆波兰表达式, 以及通过算法来实现该表达式的运算过程 ...

  6. 覃超数据结构(二) 栈和队列

    栈和队列 理论讲解 栈,或者堆栈 队列 面试题 20.有效的括号valid-parentheses 232.用栈实现队列implement-queue-using-stacks 225.用队列实现栈i ...

  7. C语言【数据结构】栈和队列【OJ题(C++)、选择题】

    目录 一.OJ题 1.225. 用队列实现栈 2.232. 用栈实现队列 3.622. 设计循环队列 4.20. 有效的括号 二.选择题 1.下列关于栈的叙述正确的是(B) 2.一个栈的入栈序列为AB ...

  8. 数据结构—栈和队列经典面试题

    栈和队列面试题: 实现一个栈,要求实现Push(出栈).Pop(入栈).Min(返回最小值)的时间复杂度为O(1) 使用两个栈实现一个队列 使用两个队列实现一个栈 元素出栈.入栈顺序的合法性.如入栈的 ...

  9. python中占位符可以用什么_python占位符都有什么

    python中为什么要使用占位符? python如何在一个字符串中使用两个占位符 1. 使用连接符: + 12 world = "World"print "Hello & ...

最新文章

  1. tensorflow mnist 1
  2. windows版influxDB安装与配置
  3. Tungsten Fabric SDN — Service Chain — HA/LB
  4. MFC控件的颜色设置
  5. 说说 JAVA 代理模式
  6. 采样算法哪家强?一个针对主流采样算法的比较
  7. C#使用事件方式Winform窗体之间传值
  8. DevIL真是好用得想哭
  9. php最大并发数,php内置开发服务器的最大并发连接数
  10. 在Java / Maven中处理“Xerces hell”?
  11. ubuntu16.04装机1:安装NVIDIA显卡驱动(下载.run包方式)
  12. IEEP-网络实施-项目交付流程
  13. 开源小程序商城源码-来客电商
  14. iphone5s显示被停用了解决办法
  15. coolie —— 前端开发构建工具。
  16. 江苏自考计算机专业,2021年江苏自考本科专业选择:计算机类专业前景如何?有哪些科目?...
  17. 计算机双机对连局域网,图解双机/多机无线互联技巧_局域网教程
  18. 在 iPad和 iPhone的浏览器上查看网页源代码
  19. C++ std::string::find()函数(在字符串中查找内容)
  20. 2020年最新Django经典面试问题与答案汇总(下)-大江狗整理

热门文章

  1. 2022-2028年中国滑雪产业投资分析及前景预测报告(全卷)
  2. IPython 更改默认字体大小
  3. python 过滤出某后缀名文件
  4. python any()和all()用法
  5. pytorch 状态字典:state_dict 模型和参数保存
  6. TVM代码生成codegen
  7. 多级中间表示概述MLIR
  8. 双圆弧插值算法(一)
  9. 虚拟机为cenots配置网络
  10. 【CV】Pytorch一小时入门教程-代码详解