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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
遗传算法python版
Mar 19 Python
使用python 3实现发送邮件功能
Jun 15 Python
python实现汉诺塔算法
Mar 01 Python
python文件拆分与重组实例
Dec 10 Python
浅谈python中get pass用法
Mar 19 Python
详解Python匿名函数(lambda函数)
Apr 19 Python
Django自定义模板过滤器和标签的实现方法
Aug 21 Python
pytorch 图像中的数据预处理和批标准化实例
Jan 15 Python
Python使用pyenv实现多环境管理
Feb 05 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 Python
Python基础之元编程知识总结
May 23 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_exists无效的解决办法
2013/06/26 PHP
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
如何用js控制css中的float的代码
2007/08/16 Javascript
JavaScript 精粹读书笔记(1,2)
2010/02/07 Javascript
JavaScript输入邮箱自动提示实例代码
2014/01/13 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
举例讲解如何判断JavaScript中对象的类型
2016/04/22 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
使用vue制作FullPage页面滚动效果
2017/08/21 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
2019/11/21 Javascript
Vue实现商品飞入购物车效果(电商项目)
2019/11/26 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
python3中int(整型)的使用教程
2017/03/23 Python
Python threading的使用方法解析
2019/08/28 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
个人原因辞职信模板
2015/05/13 职场文书
《红领巾真好》教学反思
2016/02/16 职场文书
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android