一、线性结构:栈、队列、双端队列、列表

二、非线性结构:树、图、堆

【算法中看堆是非线性的,因为其相当于完全二叉树,但堆的存储元素是采用线性的顺序表数组来实现的】

三、队列:

1、队列类型:FIFO、LIFO、双端队列、循环队列

FIFO:先进先出

LIFO:后进先出(相当于栈)

双端队列:LIFO和FIFO的结合,就是可从队首和队尾添加和删除元素。

循环队列:队首和队尾相连(可以解决假溢出)

2、FIFO【先进先出】、LIFO【后进先出】

Python自带的Queue模块(import queue【python3】、import Queue【Python2】)【线程不安全,需加锁】

  有三种队列类型:FIFO(queue.queue)、LIFO(queue.LifoQueue)、优先级队列(queue.PriorityQueue)【优先级队列越低越先出来】【堆】

FIFO:import queue

创建一个队列长度为10的对象:q=queue.queue(maxsize=10)

队尾插入数据x:q.put(x)

队首删除数据:q.get(),并返回该数据

返回队列的大小:q.qsize()

判断队列是否为空:q.empty(),若为空则返回True,反之则FALSE

判断是否为满:q.full与maxsize相呼应

3、Python自带的双端队列Deque模块(from collections import deque) 【线程安全,因为GIL】

(1)新建一个deque对象:q=deque('abcdefgh'),或者创建一个大小为5的队列q=deque(5)

(1)q.appendleft(x):在列表左侧插入【O(1)】

(2)q.popleft():弹出列表左侧的值【O(1)】

(3)extendleft:在左侧扩展【O(k)】

(4)q.append(x):在列表右侧插入【O(1)】

(5)q.pop():弹出列表右侧的值【O(1)】

(6)extend:在右侧扩展【O(k)】

(7)q.rotate(-n):将左端的n个元素移动到右端【O(k)】

  q.rotate(n):将右端的n个元素移动到左端

  q=deque('abcdef')

  q.rotate(-2)

  print(q)//deque(['c','d','e','f','a','b'])
  q.rotate(2)

  print(q)//deque(['e','f','a','b','c','d'])

(8)q.remove('c'):删除一个指定元素【O(n)】

(9)q.clear():清空链表所有元素,使其长度为0

(10)q.reverse():将队列反转

(11)q.count(x):返回q中x的数量

(12)len(q):返回q的长度

4、Python实现循环队列:

队尾出来进队首,双端队列的rotate可以实现循环队列。

下面的例子是用queue中的FIFO实现一个功能,6个人传土豆,每数到7就淘汰手中有土豆的人,直到最后只剩一个人。

#循环队列,num一定要比人数多
import queue
def hotpotato(namelist,num):
que=queue.Queue(len(namelist))
for name in namelist:
que.put(name)
while que.qsize()>1:
for item in range(num):
que.put(que.get())
que.get()
return que.get() namelist=['a','b','c','d','e','f']
print(hotpotato(namelist,7))

5、列表、queue、deque都可以用作队列,他们的比较:

list缺点:插入队尾时需要用insert(0,x),【因为队首在队尾】,别的元素要往后移,时间复杂度大】

queue的缺点:queue只能做put,put方向只能在队尾。

deque的缺点:remove(x) 和获取索引时速度慢,因为需要执行多个数据块。list相对快一点。

四、堆:【是一棵完全二叉树】

1、python自带的堆模块:import heapq【实现最小堆】

【实现最大堆:将元素取反存入堆,取出时再取反:将push(e)改为push(-e)、pop(e)改为-pop(e)。】

  • heap = [] #创建了一个空堆
  • heapq.heappush ( heap,item ) #往堆heap中插入一条新的值item
  • heapq.heapify(listx) #以线性时间将一个列表转化成堆
  • item = heapq.heappop ( heap ) # 从堆中弹出最小值
  • item = heap [0] #查看堆中最小值,不弹出
  • item = heapq.heapreplace(heap,item) #弹出并返回最小值,然后将heapreplace方法中item的值插入到堆中,堆的整体结构不会发生改变。这里需要考虑到的情况就是如果弹出的值大于item的时候我们可能就需要添加条件来满足function的要求:

    • if item > heap[0]:    item = heapreplace(heap, item)
  • heapq.heappushpop() #顾名思义,将值插入到堆中同时弹出堆中的最小值。
  • merge(heap1,heap2,heap3) #合并多个堆然后输出
  • heapq.nlargest(n , heap, key=None) #从堆中找出做大的N个数,key的作用和sorted( )方法里面的key类似,用列表元素的某个属性和函数作为关键字。
  • heapq.nsmallest(n, iterable, key=None) #找到堆中最小的N个数用法同上。

Python数据结构2-----队列和堆的更多相关文章

  1. 刚开始学python——数据结构——“自定义队列结构“

    自定义队列结构  (学习队列后,自己的码) 主要功能:用列表模拟队列结构,考虑了入队,出队,判断队列是否为空,是否已满以及改变队列大小等基本操作. 下面是封装的一个类,把代码保存在myQueue.py ...

  2. python数据结构之队列

    队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First In First Out)的线性表,简称FIFO.允许插入的一端为队尾,允许删除的一端 ...

  3. python数据结构之队列(二)

    书接上文,双端队列区别于单队列为:双端队列可以对队列头和尾部同时进行操作,单队列不行 #coding:utf-8 class DoubleQueue(object): def __init__(sel ...

  4. python数据结构之队列(一)

    队列概念 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First In First Out)的线性表,简称FIFO.允许插入的一端为队尾,允许 ...

  5. Python 数据结构_队列

    目录 目录 队列 队列 Queue 队列是一种先进先出(FIFO)的数据类型, 新的元素通过 入队 的方式添加进 Queue 的末尾, 出队 就是从 Queue 的头部删除元素. 用列表来做 Queu ...

  6. python数据结构之堆(heap)

    本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...

  7. PHP数据结构:栈、队列、堆、固定数组

    数据结构:栈 队列: 堆: 固定尺寸的数组:

  8. python数据结构之栈与队列

    python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...

  9. Python数据结构之实现队列

    再学习数据结构队列的时候,我不想讲太多!一切言语不如几张图来的实在! 这是第一张图,第二图是讲队列满的情况: 分析了数据结构中的队列是什么之后,我们开始写代码,代码Code如下: #coding:ut ...

随机推荐

  1. 【Codeforces 996B】World Cup

    [链接] 我是链接,点我呀:) [题意] [题解] 你可以找出来a[i]里面的最小值mi,显然是这个数字最可能先变成0,但还不确定. 然后用mi/n得到你最少需要走多少圈才能让那个mi变成" ...

  2. 【codeforces 798A】Mike and palindrome

    [题目链接]:http://codeforces.com/contest/798/problem/A [题意] 让你严格改变一个字符,使得改变后的字符串为一个回文串; 让你输出可不可能; [题解] 直 ...

  3. 【hihocoder 1329】平衡树·Splay(Splay做法)

    [题目链接]:http://hihocoder.com/problemset/problem/1329 [题意] [题解] 插入操作:-,记住每次插入之后都要把它放到根节点去就好; 询问操作:对于询问 ...

  4. lucene_04_解析语法查询

    解析语法查询就是调用方法查询的原始查询 例如: 查询所有的查询器的语法为:*:*,因为lucene查询是根据term来做的,既是:key:value类型.*:*表示所有域中的所有值. api调用语法解 ...

  5. orcale 查询

    修改日期显示形式: alter session set nls_date_formate='DD-MON-RR'; alter session set nls_date_formate='yyyy-M ...

  6. js 元素遍历

    2018-06-26 //百度首页测试 var i, len = 0, element = document.querySelector('#s_form_wrapper'), child = ele ...

  7. Sigma Function 数学 因子求和

    Sigma function is an interesting function in Number Theory. It is denoted by the Greek letter Sigma ...

  8. IntelliJ IDEA测试学习网站

    IntelliJ IDEA测试学习网站 http://idea.lanyus.com/  嗯,请支持正版:

  9. 【solr基础教程之中的一个】Solr相关知识点串讲

           Solr是Apache Lucene的一个子项目.Lucene为全文搜索功能提供了完备的API.但它仅仅作为一个API库存在.而不能直接用于搜索. 因此,Solr基于Lucene构建了一 ...

  10. udev详解【转】

    本文转载自:http://blog.csdn.net/skyflying2012/article/details/9359185 如果你使用Linux比较长时间了,那你就知道,在对待设备文件这块,Li ...