python复杂数据结构之队列

python队列的标准库是queue,queue中的Queue是遵循先进先出原则,当然queue中还提供了后进先出的队列LifoQueue和优先级队列PriorityQueue队列
>>> import queue        #queue是Python标准库
>>> q=queue.Queue()
>>> q.put(0)            #入队
>>> q.put(1)
>>> q.put(2)
>>> q.queue
deque([0, 1, 2])
>>> q.get()             #出队
0
>>> q.queue             #查看队列中的元素
deque([1, 2])
>>> q.get()
1
>>> q.queue
deque([2])


>>> from queue import Queue    #LILO队列
>>> q = Queue()                #创建队列对象
>>> q.put(0)                   #在队列尾部插入元素
>>> q.put(1)
>>> q.put(2)
>>> print(q.queue)             #查看队列中所有元素
deque([0, 1, 2])
>>> q.get()                    #返回并删除队列头部元素
0
>>> q.get()
1


>>> from queue import LifoQueue  #LIFO队列
>>> q = LifoQueue()              #创建LIFO队列对象
>>> q.put(1)                     #在队列尾部插入元素
>>> q.put(2)
>>> q.put(3)
>>> q.queue                      #查看队列中所有元素
[1, 2, 3]
>>> q.get()                      #返回并删除队列尾部元素
3
>>> q.get()
2
>>> q.queue
[1]
>>> q.get()                      #对空队列调用get()方法会阻塞当前线程


>>> from queue import PriorityQueue   #优先级队列
>>> q = PriorityQueue()                         #创建优先级队列对象
>>> q.put(3)                       #插入元素
>>> q.put(8)                       #插入元素
>>> q.put(100)
>>> q.queue                       #查看优先级队列中所有元素
[3, 8, 100]
>>> q.put(1)                       #插入元素,自动调整优先级队列,并不会从尾部插入
>>> q.put(2)
>>> q.queue
[1, 2, 100, 8, 3]
>>> q.get()                        #返回并删除优先级最低的元素
1
>>> q.get()                       
2

python的collections函数还支持双端队列deque,就是该队列可以指定从队首还是对位插入元素

>>> from collections import deque
>>> q = deque(maxlen=5)               #创建最大长度为5的双端队列
>>> for item in [3, 5, 7, 9, 11]:          #把列表中的元素添加到双端队列中
 q.append(item)
>>> q.append(13)                             #队列满,自动溢出,默认队首的元素被溢出
>>> q.append(15)
>>> q
deque([7, 9, 11, 13, 15], maxlen=5)
>>> q.appendleft(5)                          #从左侧添加元素,右侧自动溢出(此时队尾的元素溢出)
>>> q
deque([5, 7, 9, 11, 13], maxlen=5)



自定义队列结构和自定义双端队列结构

idle的shell安装好后是不支持自定义队列结构,需要导入其他的模块
导入模块后的队列结构用法如下:
>>> import myQueue
>>> q = myQueue.myQueue()
>>> q.get()
The queue is empty
>>> q.put(5)
>>> q.put(7)
>>> q.isFull()
False
>>> q.put('a')
>>> q.put(3)
>>> q.show()
[5, 7, 'a', 3]
>>> q.setSize(3)
>>> q.show()
[5, 7, 'a']
>>> q.put(10)
The queue is full
>>> q.setSize(5)
>>> q.put(10)
>>> q.show()
[5, 7, 'a', 10]


同样自定义双端队列的使用也需要导入其他的模块

其用法如下:>>> from myDeque import myDeque  #导入自定义双端队列类
>>> q = myDeque(range(5))               #创建双端队列对象
>>> q
myDeque([0, 1, 2, 3, 4], maxlen=10)
>>> q.appendLeft(-1)                          #在队列左侧入队
>>> q.appendRight(5)                         #在队列右侧入队
>>> q
myDeque([-1, 0, 1, 2, 3, 4, 5], maxlen=10)
>>> q.popLeft()                                   #在队列左侧出队
-1
>>> q.popRight()                                 #在队列右侧出队
>>> q.reverse()                     #元素翻转
>>> q
myDeque([4, 3, 2, 1, 0], maxlen=10)
>>> q.isEmpty()                     #测试队列是否为空
False
>>> q.rotate(-3)                      #元素循环左移
>>> q
myDeque([1, 0, 4, 3, 2], maxlen=10)
>>> q.setSize(20)                  #改变队列大小
>>> q
myDeque([1, 0, 4, 3, 2], maxlen=20)
>>> q.clear()                          #清空队列元素
>>> q
myDeque([], maxlen=20)
>>> q.isEmpty()
True

猜你喜欢

转载自blog.csdn.net/eacxzm/article/details/79996813