是否有任何有趣的算法同时使用堆栈和队列(deque)ADT?

时间:2011-03-13 03:07:49

标签: c algorithm data-structures stack queue

我们经常在算法中使用堆栈或队列,但是在任何情况下我们使用双向链表来实现两者堆栈和算法中的队列?例如,在一个阶段,我们将()将6个项目推入堆栈,pop()2个项目,然后从双向链接列表的尾部将其余项目(4)出列()。我正在寻找的是那些在这种方法中实现某些东西的模糊,有趣的算法,甚至是陌生的。伪代码,链接和解释都很不错。

4 个答案:

答案 0 :(得分:7)

Melkman算法 (用于计算线性时间内简单多边形链的凸包)使用双端队列(又名 deque )存储已处理顶点的增量外壳。

Input: a simple polyline W with n vertices V[i]

    Put first 3 vertices onto deque D so that:
    a) 3rd vertex V[2] is at bottom and top of D
    b) on D they form a counterclockwise (ccw) triangle

    While there are more polyline vertices of W to process
    Get the next vertex V[i]
    {
        Note that:
        a) D is the convex hull of already processed vertices
        b) D[bot] = D[top] = the last vertex added to D

        // Test if V[i] is inside D (as a polygon)
        If V[i] is left of D[bot]D[bot+1] and D[top-1]D[top]
            Skip V[i] and Continue with the next vertex

        // Get the tangent to the bottom
        While V[i] is right of D[bot]D[bot+1]
            Remove D[bot] from the bottom of D
        Insert V[i] at the bottom of D

        // Get the tangent to the top
        While V[i] is right of D[top-1]D[top]
            Pop D[top] from the top of D
        Push V[i] onto the top of D
    }

    Output: D = the ccw convex hull of W.

来源:http://softsurfer.com/Archive/algorithm_0203/algorithm_0203.htm

Joe Mitchell:Melkman’s Convex Hull Algorithm(PDF)

答案 1 :(得分:2)

此结构称为Deque,即可以在头部或尾部添加或删除元素的队列。请参阅1

答案 2 :(得分:1)

我不确定这是否合格,但您可以使用双端优先级队列将快速排序应用于文件太大而无法放入内存。我们的想法是,在常规快速排序中,您选择一个元素作为枢轴,然后将元素分为三组 - 小于枢轴的元素,等于枢轴的元素,以及大于枢轴的元素。如果您无法同时将所有项目放入内存,则可以按如下方式调整此解决方案。而不是选择单个元素作为枢轴,而是选择一些大量的元素(比如你可以装入RAM中的多少)并将它们插入到双端优先级队列中。然后,一次扫描其余元素。如果元素小于双端优先级队列的最小元素,则将其放入小于所有枢轴的元素组中。如果它大于优先级队列的最大元素,则将其放入一组大于枢轴的元素中。否则,将元素插入到双端优先级队列中,然后从队列中取出最小或最大元素并将其放入适当的组中。完成此操作后,您将把元素拆分为三个部分 - 一组可以递归排序的小元素,中间的一组元素现在已完全排序(因为如果您将它们全部排除从双端优先级队列中,它们将按排序顺序提取),以及一组大于中间元素的元素,也可以进行排序。

有关此算法和一般双端优先级队列的更多信息,请考虑查看this link到该主题的章节。

答案 3 :(得分:0)

我们可以修改广度优先搜索(通常用于在具有1个加权边的图中找到最短曲线)以使用0-1图(即边缘为0和1个权重的图)。我们可以这样做:当我们使用1边时,我们将顶点添加到后面,当我们使用0边时,我们将顶点添加到begin。