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网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
Jun 13 Python
Python学习之Django的管理界面代码示例
Feb 10 Python
pandas 选择某几列的方法
Jul 03 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
Oct 16 Python
python 日期排序的实例代码
Jul 11 Python
在python image 中安装中文字体的实现方法
Aug 22 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
Python叠加矩形框图层2种方法及效果
Jun 18 Python
详解python 支持向量机(SVM)算法
Sep 18 Python
Anaconda使用IDLE的实现示例
Sep 23 Python
Python机器学习应用之基于线性判别模型的分类篇详解
Jan 18 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后门代码解析
2014/07/05 PHP
使用纯php代码实现页面伪静态的方法
2015/07/25 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
javascript 节点遍历函数
2010/03/28 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
一个用jquery写的判断div滚动条到底部的方法【推荐】
2016/04/29 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
Bootstrap三种表单布局的使用方法
2016/06/21 Javascript
JS判断数组那点事
2017/10/10 Javascript
最实用的JS数组函数整理
2017/12/05 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
微信小程序实现手势滑动卡片效果
2019/08/26 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
js实现点击按钮随机生成背景颜色
2020/09/05 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
[49:21]完美世界DOTA2联赛循环赛 Ink Ice vs LBZS BO2第二场 11.05
2020/11/06 DOTA
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
Django 多环境配置详解
2019/05/14 Python
利用Python实现kNN算法的代码
2019/08/16 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
应届毕业生自我评价分享
2013/12/15 职场文书
师范毕业生自我鉴定
2014/01/15 职场文书
幼儿园实习生辞职信
2014/01/20 职场文书
节约电力资源的建议书
2014/03/12 职场文书
大学生社会实践评语
2014/04/25 职场文书
文艺部部长竞选稿
2015/11/21 职场文书
初中政治教学反思
2016/02/23 职场文书
幼儿园2016年圣诞活动总结
2016/03/31 职场文书