Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有没有同时使用堆栈和队列(deque)ADT的有趣算法?_C_Algorithm_Data Structures_Stack_Queue - Fatal编程技术网

C 有没有同时使用堆栈和队列(deque)ADT的有趣算法?

C 有没有同时使用堆栈和队列(deque)ADT的有趣算法?,c,algorithm,data-structures,stack,queue,C,Algorithm,Data Structures,Stack,Queue,我们经常在算法中使用堆栈或队列,但是否存在使用双链表在算法中同时实现堆栈和队列的情况?例如,在一个阶段,我们将()6个项目推到堆栈上,将()2个项目推到堆栈上,然后将()其余的项目(4)从双链接列表的尾部移出队列。我要寻找的是用这种方法实现某些东西的晦涩、有趣的算法,甚至是陌生人。伪代码、链接和解释就好了。这种结构被称为Deque,它是一个队列,可以在头部或尾部添加或删除元素。更多信息请参见。Melkman算法(用于在线性时间内计算简单多边形链的凸包)使用一个双端队列(也称为deque)来存储已

我们经常在算法中使用堆栈或队列,但是否存在使用双链表在算法中同时实现堆栈和队列的情况?例如,在一个阶段,我们将()6个项目推到堆栈上,将()2个项目推到堆栈上,然后将()其余的项目(4)从双链接列表的尾部移出队列。我要寻找的是用这种方法实现某些东西的晦涩、有趣的算法,甚至是陌生人。伪代码、链接和解释就好了。

这种结构被称为Deque,它是一个队列,可以在头部或尾部添加或删除元素。更多信息请参见。

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.
资料来源:


Joe Mitchell:(PDF)

我们可以修改宽度优先搜索(通常用于在具有1加权边的图中查找最短路径)以处理0-1图(即具有0和1加权边的图)。我们可以用下一种方法:当我们使用1-edge时,我们将顶点添加到后面,当我们使用0-edge时,我们将顶点添加到开头。

我不确定这是否符合条件,但您可以使用双端优先级队列对太大而无法放入内存的文件应用快速排序。其思想是,在常规快速排序中,选择一个元素作为轴,然后将元素分为三组:小于轴的元素、等于轴的元素和大于轴的元素。如果不能将所有项同时放入内存,可以按如下方式调整此解决方案。与其选择单个元素作为轴心,不如选择大量元素(比如说,尽可能多地放入RAM),并将它们插入到一个双端优先级队列中。然后,逐个扫描其余元素。如果该元素小于双端优先级队列中的最小元素,则将其放入小于所有枢轴的元素组中。如果它大于优先级队列中最大的元素,则将其放入一组大于枢轴的元素中。否则,将元素插入到双端优先级队列中,然后从队列中踢出最小或最大的元素,并将其放入相应的组中。一旦你完成了这项工作,你就可以把这些元素分成三块——一组可以递归排序的小元素,中间的一组元素现在已经完全排序了(因为如果你把它们从双端优先级队列中排出来,它们将按排序顺序提取),以及一组比中间元素大的元素,这些元素也可以进行排序


<>关于该算法和双端优先队列的更多信息,请参阅有关主题的一章。我完全忘记了它的名字,尽管我已经读过好几次了。你知道除了A-Steal之外,还有什么算法可以实现出列吗?@malfy我现在不记得具体的名字了,但是你需要一个优先级机制,第一个元素(head)的优先级最高。+1我不知道有什么算法。我很想看看人们想出了什么。感谢有趣的算法。很高兴它有帮助/有兴趣:)