python数据结构之队列——应用

     队列的应用明确的说确实没有栈重要,鄙人认为大概是队列的先进先出算不上一种思想,而是一种正常的思维模式,不用想到队列也可以解决。比如打印机打印文档的管理,类似的很多,其实就是大家遵守秩序排队。

应用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)
好啦,队列的应用暂且到此。对于栈和队列等线性表的学习也告一段落,在后续学习中还会用到这些知识(很快在树的遍历中我们就要遇到了),到那时我们再继续学习他们的应用吧~

猜你喜欢

转载自blog.csdn.net/xutiantian1412/article/details/79997822
今日推荐