Python中堆、栈、队列之间的区别小结

 更新时间:2025年01月17日 10:10:32   作者:Python热爱者  
本文主要介绍了Python中堆、栈、队列之间的区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、队列概念

1、队列是只有一端可以进行插入操作,而另一端可以进行删除操作的有序线性存储结构,满足先进先出的约束。

2、在计算机科学中,队列是一个集合,其中集合中的实体按顺序保存,集合上的主要(或唯一)操作是向后端位置添加实体,称为入队,前端位置并删除实体,称为出队。这使得队列成为先进先出(FIFO)数据结构。在FIFO数据结构中,添加到队列的第一个元素将是第一个要删除的元素。这相当于一旦添加新元素,在删除新元素之前必须删除之前添加的所有元素的要求。通常偷看或还输入了前面的操作,返回前面元素的值而不使其出列。队列是线性数据结构的示例,或者更抽象地是顺序集合。

3、队列提供计算机科学,运输和运营研究中的服务,其中存储和保存诸如数据,对象,人或事件的各种实体以便稍后处理。在这些上下文中,队列执行缓冲区的功能。队列在计算机程序中很常见,它们被实现为与访问例程耦合的数据结构,作为抽象数据结构或作为类的面向对象语言。常见的实现是循环缓冲区和链表。

  • 生活中典型的实例就是排队,先到的人排在前面,可先得到服务,后到的人排在后面,并且不能插队。
  • 计算机应用中典型的实例就是打印机,先发送的打印任务可以先被执行,之后的都要排队等候

二、Python实现

1、在 Python 中,和栈一样,同样可以用列表作为队列的底层实现,只需要确定列表的哪一端作为队列的头,也即删除操作端(先进先出),哪一端作为队列的尾,也即插入操作端(后进后出)。同时,把队列抽象为类,队列的先进先出操作实现为类的方法。

2、从理论上讲,队列的一个特征是它没有特定的容量。无论已包含多少元素,始终可以添加新元素。它也可以是空的,此时在再次添加新元素之前删除元素是不可能的。

3、队列的Python实现:

Queue.qsize() 返回队列的大小

Queue.empty() 如果队列为空,返回True,反之False

Queue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应

Queue.get()从队列中移除并返回数据

Queue.get_nowait() 相当于Queue.get(False),非阻塞方法

Queue.put(item[, block[, timeout]])
将item放入队列

  • timeout为正整数时,等待超时则抛出Full异常

  • block为False时,有空间可将数据放入队列,立即抛出Full异常

Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。

Queue.join() 实际上意味着等到队列为空,再执行别的操作【线程阻塞,直到队列中的所有任务处理完毕】

from Queue import Queue,LifoQueue,PriorityQueue
#先进先出队列
q=Queue(maxsize=5)
#后进先出队列
lq=LifoQueue(maxsize=6)
#优先级队列
pq=PriorityQueue(maxsize=5)
 
for i in range(5):
    q.put(i)
    lq.put(i)
    pq.put(i)
    
print "先进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(q.queue,q.empty(),q.qsize(),q.full())
print "后进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full())
print "优先级队列:%s;是否为空:%s,多大,%s;是否满,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full())
 
print q.get(),lq.get(),pq.get()
 
print "先进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(q.queue,q.empty(),q.qsize(),q.full())
print "后进先出队列:%s;是否为空:%s;多大,%s;是否满,%s" %(lq.queue,lq.empty(),lq.qsize(),lq.full())
print "优先级队列:%s;是否为空:%s,多大,%s;是否满,%s" %(pq.queue,pq.empty(),pq.qsize(),pq.full())

4、python的四种队列操作

①LILO: 先进先出,只能在尾部插入元素,只能从头部取出元素

from queue import Queue
q = Queue()    # 创建队列对象
q.put(1)       # 队列尾部插入元素
q.put(2)
q.put(3)
print(q.queue) # 查看队列中的所有元素
a = q.get()    # 返回并删除队列头部元素
print(a)
print(q.queue) # 运行结果deque([2,3])

②LIFO:先进后出,类似栈

from queue import LifoQueue
lifoQueue = LifoQueue()  # 创建对象
lifoQueue.put(1)
lifoQueue.put(2)
lifoQueue.put(3)
print(lifoQueue.queue)
lifoQueue.get()          # 返回并删除队列尾部元素
print(lifoQueue.queue)   # 运行结果[1,2]

③优先队列:队列元素为元组类型,即(优先级,数据)。

from queue import PrioritQueue as pq
pq = pq()        # 创建有限队列
pq.put(1)
pq.put(4)
pq.put(3)  
print(pq.queue)  # 运行结果[1,3,4]
pq.get()         # 返回并删除优先级最低的元素
print(pq.queue)  # 运行结果[3,4]

④双端队列

>>> from collections import deque   #双端队列
>>> dequeQueue = deque(['Eric','John','Smith'])
>>> print(dequeQueue)
deque(['Eric', 'John', 'Smith'])
>>> dequeQueue.append('Tom')    #在右侧插入新元素
>>> dequeQueue.appendleft('Terry')  #在左侧插入新元素
>>> print(dequeQueue)
deque(['Terry', 'Eric', 'John', 'Smith', 'Tom'])
>>> dequeQueue.rotate(2)    #循环右移2次
>>> print('循环右移2次后的队列',dequeQueue)
循环右移2次后的队列 deque(['Smith', 'Tom', 'Terry', 'Eric', 'John'])
>>> dequeQueue.popleft()    #返回并删除队列最左端元素
'Smith'
>>> print('删除最左端元素后的队列:',dequeQueue)
删除最左端元素后的队列: deque(['Tom', 'Terry', 'Eric', 'John'])
>>> dequeQueue.pop()    #返回并删除队列最右端元素
'John'
>>> print('删除最右端元素后的队列:',dequeQueue)
删除最右端元素后的队列: deque(['Tom', 'Terry', 'Eric'])

堆、栈、队列之间的区别

1、堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

2、栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。(后进先出)

3、队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)

到此这篇关于Python中堆、栈、队列之间的区别小结的文章就介绍到这了,更多相关Python 堆 栈 队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Linux中Python 环境软件包安装步骤

    Linux中Python 环境软件包安装步骤

    本文给大家分享的是在Linux系统中Python环境的安装步骤,以及常用的软件的安装升级,非常的实用,有需要的小伙伴可以参考下
    2016-03-03
  • OpenCV特征提取与检测之Harris角点检测

    OpenCV特征提取与检测之Harris角点检测

    这篇文章主要给大家介绍了关于OpenCV特征提取与检测之Harris角点检测的相关资料,Harris角点检测的目的是去分辨出图像中的平面、边界以及角点,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • Python找出list中最常出现元素的方法

    Python找出list中最常出现元素的方法

    这篇文章主要介绍了Python找出list中最常出现元素的方法,给出了三种常用的方法供大家对比参考,需要的朋友可以参考下
    2016-06-06
  • Python实现的登录验证系统完整案例【基于搭建的MVC框架】

    Python实现的登录验证系统完整案例【基于搭建的MVC框架】

    这篇文章主要介绍了Python实现的登录验证系统,结合完整实例形式分析了Python基于搭建的MVC框架进行登录验证操作的相关实现与使用技巧,需要的朋友可以参考下
    2019-04-04
  • 基于Python的socket库实现通信功能的示例代码

    基于Python的socket库实现通信功能的示例代码

    本文主要给大家介绍了如何使用python的socket库实现通信功能,这里简单的给每个客户端增加一个不重复的uid,客户端之间可以根据这个uid选择进行广播通信,感兴趣的小伙伴快来看看吧
    2023-08-08
  • Python经验总结:两种Type Error问题

    Python经验总结:两种Type Error问题

    这篇文章主要介绍了Python经验总结:两种Type Error问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • python 字典 setdefault()和get()方法比较详解

    python 字典 setdefault()和get()方法比较详解

    这篇文章主要介绍了python 字典 setdefault()和get()方法比较详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python日志处理模块logging用法解析

    Python日志处理模块logging用法解析

    这篇文章主要介绍了Python日志处理模块logging用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 基于pygame实现童年掌机打砖块游戏

    基于pygame实现童年掌机打砖块游戏

    这篇文章主要为大家详细介绍了基于pygame实现童年掌机打砖块游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • VSCode配合pipenv搞定虚拟环境的实现方法

    VSCode配合pipenv搞定虚拟环境的实现方法

    这篇文章主要介绍了VSCode配合pipenv搞定虚拟环境的实现方法,文中通过图文教程介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论