Python数据结构之栈、队列的实现代码分享


Posted in Python onDecember 04, 2017

1. 栈

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

栈(Stack)是限制插入和删除操作只能在一个位置进行的表,该位置是表的末端,称为栈的顶(top)。栈的基本操作有PUSH(入栈)和POP(出栈)。栈又被称为LIFO(后入先出)表。

1.1 栈的实现

class Stack(object):
  def __init__(self):
    self.stack=[]
  def isEmpty(self):
    return self.stack==[]
  def push(self,item):
    self.stack.append(item)
  def pop(self):
    if self.isEmpty():
      raise IndexError,'pop from empty stack'
    return self.stack.pop()
  def peek(self):
    return self.stack[-1]
  def size(self):
    return len(self.stack)

1.2 栈应用

1.2.1 检查程序中成对的符号

程序的语法错误经常是由缺少一个符号造成的。可用栈来检查符号是否成对。做一个空栈,如果字符是开放符号('({[')则将其push栈中。如果符号是个闭合符号(')]}'),则当栈空时报错,对应'()}'的错误。否则,将栈pop,如果弹出的符号不是对应的开放符号,则报错,对应'(}'的错误。文件末尾,如果栈为空,则报错,对应'({}'的错误。

def match(i,j):
  opens='([{'
  closes=')]}'
  return opens.index(i)==closes.index(j)
def syntaxChecker(string):
  stack=Stack()
  balanced=True
  for i in string:
    if i in '([{':
      stack.push(i)
    elif i in ')]}':
      if stack.isEmpty():
        balanced=False
        break
      else:
        j=stack.pop()
        if not match(j,i):
          balanced=False
          break
  if not stack.isEmpty():
    balanced=False
  return balanced

1.2.2 进制转换

十进制转换二进制:把十进制转成二进制一直分解至商数为0。从最底左边数字开始读,之后读右边的数字,从下读到上。

来自《Problem Solving with Algorithms and Data Structures》的图片:

Python数据结构之栈、队列的实现代码分享

代码:

def decimal_to_bin(dec):
  stack=Stack()
  cur=dec
  while cur>0:
    a=cur%2
    cur=cur/2
    stack.push(a)
  binstr=''
  while not stack.isEmpty():
    binstr+=str(stack.pop())
  return binstr

1.2.3 后缀记法

后缀记法(postfix),使用一个栈,见到一个数时入栈,遇到一个运算符时就作用于从栈弹出的两个元素,将结果弹入栈中。

(7+8)/(3+2)可以写作7 8 + 3 2 + /

来自《Problem Solving with Algorithms and Data Structures》的图片:

Python数据结构之栈、队列的实现代码分享

def infixtoPostfix(infix):
  a={}
  a['*']=3
  a['/']=3
  a['+']=2
  a['-']=2
  a['(']=1
  stack=Stack()
  post=''
  for i in infix:
    if i not in a and i!=')':
      post+=i
    elif i=='(':
      stack.push(i)
    elif i==')':
      top=stack.pop()
      while top!='(':
        post+=top
        top=stack.pop()
    else:     
      while not stack.isEmpty() and a[i]<=a[stack.peek()]:
        post+=stack.pop()
      stack.push(i)
  while not stack.isEmpty():
    post+=stack.pop()
  return post
          
def postfixExp(postfix):
  stack=Stack()
  postlist=postfix.split()
  for i in postlist:
    if i not in '+-*/':
      stack.push(i)
    else:
      a=stack.pop()
      b=stack.pop()
      result=math(i,b,a)
      stack.push(result)
  return stack.pop()
def math(x,y,z):
  if x=='+':
    return float(y)+float(z)
  if x=='-':
    return float(y)-float(z)
  if x=='*':
    return float(y)*float(z)
  if x=='/':
    return float(y)/float(z)

2 队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列(queue)也是表,使用队列时插入和删除在不同的端进行。队列的基本操作是Enqueue(入队),在表的末端(rear)插入一个元素,还有出列(Dequeue),删除表开头的元素。

class Queue(object):
  def __init__(self):
    self.queue=[]
  def isEmpty(self):
    return self.queue==[]
  def enqueue(self,x):
    self.queue.append(x)
  def dequeue(self):
    if self.queue:
      a=self.queue[0]
      self.queue.remove(a)
      return a
    else:
      raise IndexError,'queue is empty'
  def size(self):
    return len(self.queue)

总结

以上就是本文关于Python数据结构之栈、队列的实现代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python杀死一个线程的方法
Sep 06 Python
python中json格式数据输出的简单实现方法
Oct 31 Python
python Matplotlib画图之调整字体大小的示例
Nov 20 Python
Python中getpass模块无回显输入源码解析
Jan 11 Python
python保存网页图片到本地的方法
Jul 24 Python
python中logging模块的一些简单用法的使用
Feb 22 Python
Python实现FM算法解析
Jun 18 Python
Python中的整除和取模实例
Jun 03 Python
keras得到每层的系数方式
Jun 15 Python
django前端页面下拉选择框默认值设置方式
Aug 09 Python
Python实现Telnet自动连接检测密码的示例
Apr 16 Python
Django使用channels + websocket打造在线聊天室
May 20 Python
关于Python数据结构中字典的心得
Dec 04 #Python
python Flask实现restful api service
Dec 04 #Python
浅谈Python中带_的变量或函数命名
Dec 04 #Python
Python中对象的引用与复制代码示例
Dec 04 #Python
Python3 Random模块代码详解
Dec 04 #Python
利用python爬取斗鱼app中照片方法实例
Dec 03 #Python
CentOS 6.5中安装Python 3.6.2的方法步骤
Dec 03 #Python
You might like
PHP得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
php使用GD2绘制几何图形示例
2017/02/15 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
JavaScript模拟数组合并concat
2016/03/06 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
不得不知的ES6小技巧
2018/07/28 Javascript
vue中的mvvm模式讲解
2019/01/31 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
Python数据类型详解(四)字典:dict
2016/05/12 Python
Python 3中的yield from语法详解
2017/01/18 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
Python语言的变量认识及操作方法
2018/02/11 Python
python网络爬虫学习笔记(1)
2018/04/09 Python
详解python项目实战:模拟登陆CSDN
2019/04/04 Python
Python3使用Matplotlib 绘制精美的数学函数图形
2019/04/11 Python
Django实现前台上传并显示图片功能
2020/05/29 Python
通过实例解析python subprocess模块原理及用法
2020/10/10 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
CSS3 按钮边框动画的实现
2020/11/12 HTML / CSS
html5菜单折纸效果
2014/04/22 HTML / CSS
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
SHEIN香港:价格实惠的女性时尚服装
2018/08/14 全球购物
类、抽象类、接口的差异
2016/06/13 面试题
如何高效率的查找一个月以内的数据
2012/04/15 面试题
师范院校学生自荐信范文
2013/12/27 职场文书
服务承诺书格式
2014/05/21 职场文书
运动会加油稿100字
2014/09/19 职场文书
四风个人对照检查材料思想汇报
2014/09/25 职场文书
幼师辞职信范文
2015/02/27 职场文书
民事起诉书范本
2015/05/19 职场文书
2016年教师学习教师法心得体会
2016/01/20 职场文书
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL
解决 Redis 秒杀超卖场景的高并发
2022/04/12 Redis