队列的应用明确的说确实没有栈重要,鄙人认为大概是队列的先进先出算不上一种思想,而是一种正常的思维模式,不用想到队列也可以解决。比如打印机打印文档的管理,类似的很多,其实就是大家遵守秩序排队。
应用1:杨辉三角
啥是杨辉三角就不解释了,这一问题用队列解决很漂亮,当然不用也行(所以说队列不那么重要)。通过队列的应用可以线性的弹出n-1行的元素并插入第n行的元素。看下面的代码,在此只打印了n-1行,第n行的数还在队列里~另外打印内容的格式控制可以自己改进,此处只是一个思想。
from collections import deque
def yanghui(n):
que = deque()
que.append(1) # 这是第一行的
for i in range(2,n+1): # 产生第n 行元素并入列,同时打印第n-1 行的元素
que.append(1) # 第一个元素都是1
for j in range(1,i-1): # 求中间的n-2 个元素加入队列
num = que.popleft()
print(num,end=' ') # 只打印了第n行的n-2 个数
top = que[0]
que.append(num + top)
print(que.popleft()) # 打印n-1 行最后一个数
que.append(1) # 第n 行最后一个元素是1
应用2:拓扑排序
队列的其他应用往往就要综合其他数据结构的知识了,比如最短路径条数问题,我们将在学习的过程中慢慢接触。在此看一个拓扑排序的问题:
对一个有向无环图(DAG)G进行拓扑排序,是将G中所有顶点排成线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。下图的一种可能的拓扑排序结果:
2->8->0->3->7->1->5->6->9->4->11->10->12
解释一下,这种图是有向的,那么排序的要求就是 u->v那么u在v之前,为了满足这一要求,图中结点2和8要在最前面,2和8的入度均为0,即他们是整个图的头结点;将2和8去掉后,结点0,3,7入度为0,排在其后;以此类推得到最终排序。
def topologic(graph,degree,n):
# graph list[n][n] 用邻接矩阵graph[n][n]存储边权
# degree list[n] 存储每个结点的入度
# return res list[n] 排序的结果
res = []
q = deque()
for i in range(n):
if degree[i] == 0:
q.append(i)
while q:
cur = q.popleft()
res.append(cur)
for i in range(n):
if graph[cur][i] != 0:
degree[i] -= 1
if degree[i] == 0:
q.append(i)
好啦,队列的应用暂且到此。对于栈和队列等线性表的学习也告一段落,在后续学习中还会用到这些知识(很快在树的遍历中我们就要遇到了),到那时我们再继续学习他们的应用吧~