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

推荐阅读
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文提供了使用Java实现Bellman-Ford算法解决POJ 3259问题的代码示例,详细解释了如何通过该算法检测负权环来判断时间旅行的可能性。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
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社区 版权所有