1,堆栈结构
后进先出的队列
栈结构:其实就是一个后进先出的一个线性表,只能在栈顶压入或弹出元素
import queue.LifoQueue() q = queue.LifoQueue() q.put('first') q.put('second') q.put('third') print(q.get()) print(q.get()) print(q.get()) 结果 third second first
如何用列表实现栈
lis = [] lis.append('a') #压入元素‘a' lis.append('b') #压入元素'b' lis = ['a','b'] lis.pop() #弹出元素'b' lis.pop() #弹出元素'a' ################################### >>> x=[] #创建一个空列表,此处表示栈 >>> x [] >>> x.append('a') #压入元素'a' >>> x ['a'] >>> x.append('b') #压入元素'b' >>> x ['a', 'b'] >>> x.pop() #弹出栈顶元素'b' 'b' >>> x ['a'] >>> x.pop() #弹出栈顶元素'a' 'a' >>> x [] >>> x.pop() #试图对一个空栈做弹出操作,会报异常 Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: pop from empty list
2,队列
队列,类似于栈
队列,其实就是一个先进先出的线性表,只能在队首执行删除操作,在队尾执行插入操作,用列表表示队列,可以用append()方法实现队尾插入元素,用pop(0)方法实现在队首删除元素
>>> x=[] >>> x.append('a') >>> x ['a'] >>> x.append('b') >>> x ['a', 'b'] >>> x.pop(0) 'a' >>> x.pop(0) 'b' >>> x.pop(0) Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: pop from empty list
3,优先级队列
q = queue.PriorityQueue()
put进入一个元组,元组的第一个元素是优先级,通常是数字,也可以是非数字之间的比较,数字越小,优先级越高,负数也可以
如果两个值的优先级一样,那么按照后面的数据的ASCII码顺序来排序
q = queue.PriorityQueue() q.put((1, "david")) q.put((3, "world")) q.put((2, "hello")) print(q.get()) print(q.get()) print(q.get()) ######################## (1, 'david') (2, 'hello') (3, 'world')
这三种队列都是安全的,不会出现多个线程抢占同一个资源的情况