一,栈与队列的基础知识
1. 栈(stacks)是一种只能通过访问其一端实现数据储存与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征。
2. 队列(queue) 是一种具有先进先出特征的线性数据结构,元素的增加只能在一端进行,元素的删除只能在另一端进行。能够增加元素的队列一端称为队尾,可以删除元素的队列一端则称为队首
3. 队列是线程间最常用的交换数据的形式。在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换的时候,队列就出现了,队列可以完美解决线程间的数据交换,保证线程间数据的安全性和一致性。
二、Python数据结构:
1. 队列:
队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。先进先出(First-In-First-Out,FIFO)的数据结构。 队列被用在很多地方,比如提交操作系统执行的一系列进程、打印任务池等,一些仿真系统用队列来模拟银行或杂货店里排队的顾客(也就是有顺序的储存,先来先走)
from multiprocessing import Queue from queue import Queue # 创建一个长度为5的队列 q = Queue(5) # 判队空 print(q.empty()) # 入队:向队列中添加元素 q.put(1) q.put("abc") q.put([1, 2, 3]) q.put({"a": 123}) q.put((1, 2)) # 判队满 print(q.full()) # 量队 print(q.qsize()) # 出队:从队列中取出元素 print(q.get()) print(q.get()) print(q.get()) print(q.get()) print(q.get()) # 判断队空 print(q.empty()) # 量队 print(q.qsize()) # 非阻塞入队 q.put_nowait(6) # 非阻塞出队 print(q.get_nowait()) # 如果取完了队列,就会处于阻塞状态,等待进来的值
2. 栈:
栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶。咖啡厅内的一摞盘子是现实世界中常见的栈的例子。只能从最上面取盘子,盘子洗净后,也只能摞在这一摞盘子的最上面。
from queue import LifoQueue # 定义一个5长度的栈 s = LifoQueue(5) # 进栈:向栈中添加元素 s.put(1) s.put(2) s.put(3) s.put(4) s.put(5) # 判栈满 print(s.full()) # 量栈 print(s.qsize()) # 退栈:从栈中取出元素 print(s.get()) print(s.get()) print(s.get()) print(s.get()) print(s.get()) # 判栈空 print(s.empty()) # 量栈 print(s.qsize()) # 没有也会处于阻塞的状态