Python实现栈和队列的简单操作方法示例


Posted in Python onNovember 29, 2019

本文实例讲述了Python实现栈和队列的简单操作方法。分享给大家供大家参考,具体如下:

先简单的了解一下数据结构里面的栈和堆:

栈和队列是两种基本的数据结构,同为容器类型。两者根本的区别在于:

stack:后进先出

Python实现栈和队列的简单操作方法示例

queue:先进先出

Python实现栈和队列的简单操作方法示例

stack和queue是不能通过查询具体某一个位置的元素而进行操作的。但是他们的排列是按顺序的

对于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]

我们定义如下的链表来实现队列数据结构:

Python实现栈和队列的简单操作方法示例

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

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

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
利用QT写一个极简单的图形化Python闹钟程序
Apr 07 Python
Python3 操作符重载方法示例
Nov 23 Python
详解python while 函数及while和for的区别
Sep 07 Python
python+selenium实现自动抢票功能实例代码
Nov 23 Python
Python3中exp()函数用法分析
Feb 19 Python
Django Channels 实现点对点实时聊天和消息推送功能
Jul 17 Python
详解python中自定义超时异常的几种方法
Jul 29 Python
python中的subprocess.Popen()使用详解
Dec 25 Python
Matplotlib使用字符串代替变量绘制散点图的方法
Feb 17 Python
Python中sys模块功能与用法实例详解
Feb 26 Python
Python操作Excel把数据分给sheet
May 20 Python
深入解析NumPy中的Broadcasting广播机制
May 30 Python
python调用函数、类和文件操作简单实例总结
Nov 29 #Python
Python3实现将一维数组按标准长度分隔为二维数组
Nov 29 #Python
python实现把两个二维array叠加成三维array示例
Nov 29 #Python
python的time模块和datetime模块实例解析
Nov 29 #Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 #Python
Python 基于wxpy库实现微信添加好友功能(简洁)
Nov 29 #Python
Python+numpy实现矩阵的行列扩展方式
Nov 29 #Python
You might like
浅析PHP中的UNICODE 编码与解码
2013/06/29 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
2017/06/06 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
javascript函数库-集合框架
2007/04/27 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
使用JSLint提高JS代码质量方法分享
2013/12/16 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
js实现兼容性好的微软官网导航下拉菜单效果
2015/09/07 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
Python中的两个内置模块介绍
2015/04/05 Python
Python用模块pytz来转换时区
2016/08/19 Python
Python爬虫实例扒取2345天气预报
2018/03/04 Python
详解【python】str与json类型转换
2019/04/29 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
2019/09/06 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
一年级班主任寄语
2014/01/19 职场文书
九年级化学教学反思
2014/01/28 职场文书
眼镜促销方案
2014/03/15 职场文书
十周年庆典策划方案
2014/06/03 职场文书
爱国之歌(8首)
2019/09/29 职场文书
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android