热门标签 | 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()

推荐阅读
  • 本文详细介绍了 Redis 中的主要数据类型,包括 String、Hash、List、Set、ZSet、Geo 和 HyperLogLog,并提供了每种类型的基本操作命令和应用场景。 ... [详细]
  • 本文详细介绍了Socket在Linux内核中的实现机制,包括基本的Socket结构、协议操作集以及不同协议下的具体实现。通过这些内容,读者可以更好地理解Socket的工作原理。 ... [详细]
  • 本文详细介绍了二叉堆的概念及其在Java中的实现方法。二叉堆是一种特殊的完全二叉树,具有堆性质,常用于实现优先队列。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 深入解析Python进程间通信:Queue与Pipe的应用
    本文详细探讨了Python中进程间通信的两种常用方法——Queue和Pipe,并通过具体示例介绍了它们的基本概念、使用方法及注意事项。 ... [详细]
  • 前言:由于Android系统本身决定了其自身的单线程模型结构。在日常的开发过程中,我们又不能把所有的工作都交给主线程去处理(会造成UI卡顿现象)。因此,适当的创建子线程去处理一些耗 ... [详细]
  • 本文详细介绍了如何在PHP中使用Memcached进行数据缓存,包括服务器连接、数据操作、高级功能等。 ... [详细]
  • 本文探讨了在已知最终数组尺寸不会超过5000x10的情况下,如何利用预分配和调整大小的方法来优化Numpy数组的创建过程,以提高性能并减少内存消耗。 ... [详细]
  • 一、使用Microsoft.Office.Interop.Excel.DLL需要安装Office代码如下:2publicstaticboolExportExcel(S ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 电商高并发解决方案详解
    本文以京东为例,详细探讨了电商中常见的高并发解决方案,包括多级缓存和Nginx限流技术,旨在帮助读者更好地理解和应用这些技术。 ... [详细]
  • Java中的引用类型详解
    本文详细介绍了Java中的引用类型,包括强引用、软引用、弱引用和虚引用的特点和应用场景。 ... [详细]
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社区 版权所有