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使用新浪微博API发送微博的例子
Apr 10 Python
关于Python面向对象编程的知识点总结
Feb 14 Python
详解python3中zipfile模块用法
Jun 18 Python
利用python在excel里面直接使用sql函数的方法
Feb 08 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 Python
Django集成搜索引擎Elasticserach的方法示例
Jun 04 Python
Django  ORM 练习题及答案
Jul 19 Python
Python关于__name__属性的含义和作用详解
Feb 19 Python
python一些性能分析的技巧
Aug 30 Python
利用python做表格数据处理
Apr 13 Python
pytorch查看网络参数显存占用量等操作
May 12 Python
Python中可变和不可变对象的深入讲解
Aug 02 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中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
phpExcel中文帮助手册之常用功能指南
2014/08/18 PHP
PHP命令行脚本接收传入参数的三种方式
2014/08/20 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
在laravel中使用with实现动态添加where条件
2019/10/10 PHP
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
JS字符串的切分用法实例
2016/02/22 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
jQuery图片左右滚动代码 有左右按钮实例
2016/06/20 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
Python中的time模块与datetime模块用法总结
2016/06/30 Python
使用Python中的tkinter模块作图的方法
2017/02/07 Python
Python Socket实现简单TCP Server/client功能示例
2017/08/05 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
python3中eval函数用法使用简介
2019/08/02 Python
python实现静态web服务器
2019/09/03 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
电子商务个人自荐信
2013/12/12 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
有关环保的标语
2014/06/13 职场文书
代领毕业证委托书
2014/08/02 职场文书
车辆年审委托书范本
2014/09/18 职场文书
单位委托书怎么写
2014/09/21 职场文书
现役军人家属慰问信
2015/03/24 职场文书
教师节祝酒词
2015/08/11 职场文书
Nginx+Tomcat负载均衡集群的实现示例
2021/10/24 Servers
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫