排序堆栈

问题描述

| 我知道如何对数组进行排序,但是我之前没有对堆栈进行排序。 所以请帮忙。如何使用quicksort算法对堆栈进行排序? 谢谢。     

解决方法

  我知道如何对数组进行排序,但是我以前没有对堆栈进行排序。 最有效的解决方案可能是将数据结构更改为允许随机访问的列表,然后对列表进行排序。即,像这样的东西: 将堆栈中的所有元素弹出到数组中 使用您知道的算法并对数组进行排序。 将所有元素推回堆栈。 如果您绝对不想使用列表,则可能会发现此解决方案很有趣。 (从这里被盗):
void sort(stack)
{
    type x;

    if (!isEmpty(stack)) {
        x = pop(stack);
        sort(stack);
        insert(x,stack);
    }           
}

void insert(x,stack)
{
    type y;

    if (!isEmpty(stack) && top(stack) < x) {
        y = pop(stack);
        insert(x,stack);
        push(y,stack);
    } else {
        push(x,stack);
    }
} 
    ,“对堆栈进行排序”是什么意思?堆栈的整体思想是按照后进先出(LIFO)的顺序进行。使用堆栈的事物期望它们放置在堆栈中的最新事物将位于堆栈的顶部,而较旧的事物位于其下方,因此插入时的顺序相反,因为这就是堆栈。如果您对堆栈进行排序,将会破坏它。     ,您可以做的是..使用递归,递归地弹出堆栈中的元素,然后找到插入当前元素的最佳位置。让我知道您是否需要代码,但是如前面的注释中所述,对堆栈进行排序是完全没有必要的:) :)     ,我编写了此函数,以使用O(n)空间对堆栈进行排序。这工作得很好。我将不胜感激时间的改善。现在是O(n * n)。
StackHead sortStack(StackHead s1){

StackHead s2=createStack();
Element a,b;

while(!isEmpty(s1)){

    a=top(s1);s1=pop(s1);
    if(isEmpty(s2) || top(s2) > a){
            s2=push(a,s2);
    } else {
            while(top(s2)<=a && !isEmpty(s2)){
                    b=top(s2); s2=pop(s2);
                    s1=push(b,s1);
            }

            s2=push(a,s2);

            while( (isEmpty(s2) || top(s1) < top(s2) ) && !isEmpty(s1)) {
                    b=top(s1); s1=pop(s1);
                    s2=push(b,s2);
            }
    }//end of else

}//end of outer while

return s2;

}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...