热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python数据结构算法(03)栈队列

Python数据结构&算法(03)栈和队列文章目录Python数据结构&算法(03)栈和队列3.1栈3.1.1栈的基本操作3.1.2链式栈3.2队列3.2.1队列的基本操作3.2.

Python数据结构&算法(03) 栈和队列


文章目录

  • Python数据结构&算法(03) 栈和队列
    • 3.1 栈
      • 3.1.1 栈的基本操作
      • 3.1.2 链式栈
    • 3.2 队列
      • 3.2.1 队列的基本操作
      • 3.2.2 链式队列
      • 3.3.3 循环队列


3.1 栈

可以理解为只允许在表尾进行插入或删除的线性表,对栈而言,其表尾称为栈顶,相应的其表头端称为栈底,不含元素的空表称为空栈。

假设栈 S = (a1, a2, ..., an) ,则称 a1 为栈底元素,an 为栈顶元素。栈中元素是按照 a1, a2, ..., an 的顺序依次进栈的,退栈的第一个元素应为栈顶元素,因此栈可以被称为 后进先出(LIFO) 结构的线性表。

在这里插入图片描述


3.1.1 栈的基本操作

栈的抽象数据类型定义如下所示:

ADT Stack{数据对象:D = {ai | ai ∈ ElemSet, i = 1, 2, ..., n, n >= 0}数据关系:R = { | ai-1, ai ∈ D, i = 2, ..., n}约定 an 为栈顶,a1 为栈底。基本操作:初始化栈插入元素删除元素清空栈判断栈是否为空返回栈中元素个数返回栈顶元素的值遍历栈
}

在python中,列表很好的实现了栈的功能,使用相关函数即可实现出栈和入栈的操作。

list.append() # 将元素添加至末尾list.pop([index=-1]) # 删除指定位置的元素,若为空则删除末尾元素

3.1.2 链式栈

如果使用链表实现栈则可以使用尾插法模拟入栈操作,指定删除最后一个元素即可实现出栈操作。

class Node:def __init__(self, elem=None):self.elem = elemself.next = Noneclass Stack:def __init__(self):self.__base = Node(-1)self.__top = self.__basedef push(self, elem):newNode = Node(elem)self.__top.next = newNodeself.__top = newNodedef pop(self):if self.__base.next == None:print("Error!")return 0else:nowNode = self.__basewhile nowNode.next.next != None:nowNode = nowNode.nextnowNode.next = Noneself.__top = nowNodedef clear(self):self.__base.next = Noneself.__top = self.__basedef isEmpty(self):return self.__base.elem == self.__top.elemdef num(self):num = 0nowNode = self.__basewhile nowNode.next != None:nowNode = nowNode.nextnum = num + 1return numdef getTop(self):return self.__top.elemdef printStack(self):nowNode = self.__base.nextwhile nowNode != None:print(nowNode.elem)nowNode = nowNode.nextif __name__ == "__main__":S = Stack()for i in range(1, 10):S.push(i)S.printStack()

3.2 队列

队列与栈相反,是一种先进先出(FIFO)的线性表,它只允许在表的一端进行插入,而在另一端删除元素。在队列中,允许插入的一端叫做队尾,允许删除的一端叫做队头

在这里插入图片描述


3.2.1 队列的基本操作

队列的操作与栈的操作类似,不同之处在于删除是在表的头部(队头)进行的。

ADT Queue{数据对象:D = {ai | ai ∈ ElemSet, i = 1, 2, ..., n, n >= 0}数据关系:R = { | ai-1, ai ∈ D, i = 2, ..., n}基本操作:初始化队列插入元素删除元素清空队列判断队列是否为空返回队列中元素个数返回队头元素的值遍历队列
}

3.2.2 链式队列

用链表表示的队列简称为链队列,一个链队列需要两个分别指示队头和队尾的指针。

class Node:def __init__(self, elem=None):self.elem = elemself.next = Noneclass Queue:def __init__(self):self.__front = Node(-1)self.__rear = self.__frontdef enQueue(self, elem):newNode = Node(elem)self.__rear.next = newNodeself.__rear = newNodedef deQueue(self):if self.__front.next == None:print("Error!")return 0else:self.__front.next = self.__front.next.nextdef clear(self):self.__front.next = Noneself.__rear = self.__frontdef isEmpty(self):return self.__front == self.__reardef num(self):num = 0nowNode = self.__frontwhile nowNode.next != None:nowNode = nowNode.nextnum = num + 1return numdef getHead(self):if self.__front.next == None:print("Error!")return 0else:return self.__front.next.elemdef printQueue(self):nowNode = self.__front.nextwhile nowNode != None:print(nowNode.elem)nowNode = nowNode.nextif __name__ == "__main__":Q = Queue()for i in range(1, 10):Q.enQueue(i)Q.printQueue()

3.3.3 循环队列

循环队列需要给队列指定一个最大长度,整体逻辑结构如同一个环,这里实现采用顺序表示(用一组地址连续的存储单元依次存储元素)。

在这里插入图片描述

class CircularQueue:def __init__(self, maxSize):self.queue = [None] * maxSizeself.maxSize = maxSizeself.__front = 0self.__rear = 0def num(self):if self.queue[self.__rear] == None:return (self.__rear - self.__front + self.maxSize) % self.maxSizeelse:return self.maxSizedef enQueue(self, elem):if (self.__rear + 1) % self.maxSize == self.__front:if self.queue[self.__rear] == None:self.queue[self.__rear] = elemelse:print("FULL QUEUE!")else:self.queue[self.__rear] = elemself.__rear = (self.__rear + 1) % self.maxSizedef deQueue(self):if self.__front == self.__rear:print("EMPTY QUEUE!")return 0else:self.queue[self.__front] = Noneif (self.__rear + 1) % self.maxSize == self.__front:self.__rear = (self.__rear + 1) % self.maxSizeself.__front = (self.__front + 1) % self.maxSizedef printCircularQueue(self):for i in range(self.maxSize):print(self.queue[i])if __name__ == "__main__":CQ = CircularQueue(9)for i in range(1, 10):CQ.enQueue(i)CQ.printCircularQueue()

推荐阅读
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文介绍了贝叶斯垃圾邮件分类的机器学习代码,代码来源于https://www.cnblogs.com/huangyc/p/10327209.html,并对代码进行了简介。朴素贝叶斯分类器训练函数包括求p(Ci)和基于词汇表的p(w|Ci)。 ... [详细]
author-avatar
踏山321
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有