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中操作时间之tzset()方法的使用教程
May 22 Python
Python如何判断数独是否合法
Sep 08 Python
20个常用Python运维库和模块
Feb 12 Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
python对矩阵进行转置的2种处理方法
Jul 17 Python
python安装本地whl的实例步骤
Oct 12 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
Python decorator拦截器代码实例解析
Apr 04 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
pandas统计重复值次数的方法实现
Feb 20 Python
python实现简单石头剪刀布游戏
Oct 24 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
迅雷下载《中学科技》怀旧期刊下载
2021/02/27 无线电
一个典型的PHP分页实例代码分享
2011/07/28 PHP
php通过记录IP来防止表单重复提交方法分析
2014/12/16 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
动态控制Table的js代码
2007/03/07 Javascript
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
Jquery选择器 $实现原理
2009/12/02 Javascript
js在输入框屏蔽按键,只能键入数字的示例代码
2014/01/03 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
jQuery实现手势解锁密码特效
2017/08/14 jQuery
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
JS写谷歌浏览器chrome的外挂实例
2018/01/11 Javascript
js+html5实现手机九宫格密码解锁功能
2018/07/30 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
微信小程序实现3D轮播图效果(非swiper组件)
2019/09/21 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
Jquery Fade用法详解
2020/11/06 jQuery
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
python引用DLL文件的方法
2015/05/11 Python
讲解Python中运算符使用时的优先级
2015/05/14 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
Python猴子补丁知识点总结
2020/01/05 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
实习护理工作自我评价
2013/09/25 职场文书
大学生怎样进行自我评价
2013/12/07 职场文书
大学生创业策划书
2014/02/02 职场文书
机械工程师岗位职责
2014/06/16 职场文书
早上好问候语大全
2015/11/10 职场文书
CSS中em的正确打开方式详解
2021/04/08 HTML / CSS
Python制作一个随机抽奖小工具的实现
2021/07/07 Python