队列
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出的(First In First Out)的线性表,简称FIFO。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!假设队列是q=(a1,a2,……,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,总是在队列最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍最后。
队列的实现
同栈一样,队列也可以用顺序表或者链表实现。
操作
- Queue() 创建一个空的队列
- enqueue(item) 往队列中添加一个item元素
- dequeue() 从队列头部删除一个元素
- is_empty() 判断一个队列是否为空
- size() 返回队列的大小
class Queue(object): """队列""" def __init__(self): self.items = [] def is_empty(self): return self.items == [] def enqueue(self, item): """进队列""" self.items.insert(0,item)#self.__item.append(item) def dequeue(self): """出队列""" return self.items.pop()#return self.items.pop(0) def size(self): """返回大小""" return len(self.items) if __name__ == "__main__": q = Queue() q.enqueue("hello") q.enqueue("world") q.enqueue("itcast") print(q.size()) print(q.dequeue()) print(q.dequeue()) print(q.dequeue())
结果:
3 hello world itcast
双端队列
双端队列(deque,全名double-ended queue),是一种具有队列和栈的性质的数据结构。
双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。双端队列可以在队列任意一端入队和出队。
操作
class Deque(object): """双端队列""" def __init__(self): self.items = [] def is_empty(self): """判断队列是否为空""" return self.items == [] def add_front(self, item): """在队头添加元素""" self.items.insert(0,item) def add_rear(self, item): """在队尾添加元素""" self.items.append(item) def remove_front(self): """从队头删除元素""" return self.items.pop(0) def remove_rear(self): """从队尾删除元素""" return self.items.pop() def size(self): """返回队列大小""" return len(self.items) if __name__ == "__main__": deque = Deque() deque.add_front(1) deque.add_front(2) deque.add_rear(3) deque.add_rear(4) print(deque.size()) print(deque.remove_front()) print(deque.remove_front()) print(deque.remove_rear()) print(deque.remove_rear()) 结果: 4 2 1 4 3
python队列Queue
Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递
基本FIFO队列
class Queue.Queue(maxsize=0)
FIFO即First in First Out,先进先出。Queue提供了一个基本的FIFO容器,使用方法很简单,maxsize是个整数,指明了队列中能存放的数据个数的上限。一旦达到上限,插入会导致阻塞,直到队列中的数据被消费掉。如果maxsize小于或者等于0,队列大小没有限制。
举个栗子:
import Queue q = Queue.Queue() for i in range(5): q.put(i) while not q.empty(): print q.get()
输出:
1 0 2 1 3 2 4 3 5 4
LIFO队列(类似栈)
class Queue.LifoQueue(maxsize=0)
LIFO即Last in First Out,后进先出。与栈的类似,使用也很简单,maxsize用法同上
再举个栗子:
import Queue q = Queue.LifoQueue() for i in range(5): q.put(i) while not q.empty(): print q.get()
输出:
4
3
2
1
0
#FIFO队列 import queue q=queue.Queue(3) #定义一个3位置的队列 #使用put方法往队列中添加元素,需要考虑是否能放下的问题 #如果放不下了,默认会阻塞(block=True),阻塞时可以定义超时时间(timeout=5) #可以使用block=False设置不阻塞立即报错 q.put(11) q.put(22) q.put(33) print(q.empty()) #判断队列是否为空,如果为空返回False,不为空返回True print(q.qsize()) #输出队列中元素个数 q.put(44,block=True,timeout=5) #使用get方法从队列中取数据,需要考虑是否有数据可取的问题 #如果无数据可取,默认会阻塞(block=True),阻塞时可以定义超时时间(timeout=2) #可以使用block=False设置不阻塞立即报错 print(q.get()) print(q.get()) print(q.get()) print(q.get(block=True,timeout=2)) #另外还有join与task_done方法,这两个方法是成对使用的 #join方法用于阻塞进程不继续往下执行,当队列中任务执行完后,不再阻塞 #解释器怎样知道队列中任务执行完了呢?通过task_done方法显式告诉解释器某个任务已经执行完毕 que=queue.Queue(3) #定义一个3位置的队列对象 que.put(11) que.put(22) que.put(33) que.get() que.task_done() #告诉解释器上一个任务已经执行完毕 que.get() que.task_done() #告诉解释器上一个任务已经执行完毕 que.join()