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的Django框架中模板碎片缓存简介
Jul 24 Python
python正则表达式面试题解答
Apr 28 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
python中的常量和变量代码详解
Jul 25 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
python3实现mysql导出excel的方法
Jul 31 Python
详细介绍pandas的DataFrame的append方法使用
Jul 31 Python
Python requests设置代理的方法步骤
Feb 23 Python
Django框架静态文件处理、中间件、上传文件操作实例详解
Feb 29 Python
python 实现仿微信聊天时间格式化显示的代码
Apr 17 Python
Selenium自动化测试工具使用方法汇总
Jun 12 Python
使用Python判断一个文件是否被占用的方法教程
Dec 16 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之第一天
2006/10/09 PHP
使用php转义输出HTML到JavaScript
2015/03/27 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
2013/03/25 Javascript
解决Jquery向页面append新元素之后事件的绑定问题
2015/03/16 Javascript
nw.js实现类似微信的聊天软件
2015/03/16 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
Vue.js实现输入框绑定的实例代码
2017/08/24 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
解决vue无法侦听数组及对象属性的变化问题
2020/07/17 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
如何在vue 中引入使用jquery
2020/11/10 jQuery
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
python和C语言混合编程实例
2014/06/04 Python
python将字符串转换成数组的方法
2015/04/29 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
python生成每日报表数据(Excel)并邮件发送的实例
2019/02/03 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
美国顶尖折扣时尚购物网:Bluefly
2016/08/28 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
如何利用find命令查找文件
2016/11/18 面试题
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
2014学校庆三八妇女节活动总结
2014/03/01 职场文书
个人工作主要事迹
2014/05/08 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
大学生违纪检讨书300字
2014/10/25 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
2016大学生社会实践单位评语
2015/12/01 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python