排序堆栈

时间:2011-05-25 13:06:45

标签: c sorting stack

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

4 个答案:

答案 0 :(得分:4)

“排序堆栈”是什么意思?堆栈的整个想法是它以后进先出(LIFO)顺序。使用堆栈的东西期望他们放在堆栈上的最新东西将位于堆栈的顶部,其下方有较旧的东西,在插入时反向排序,因为这就是堆栈 。如果你对堆栈进行排序,你就会打破它。

答案 1 :(得分:3)

  

我知道如何对数组进行排序,但我之前没有排序。

最有效的解决方案可能是将数据结构更改为允许随机访问然后对列表进行排序的列表。即,像这样:

  1. 将堆栈的所有元素弹出到数组
  2. 使用知道的算法并对数组进行排序。
  3. 将所有元素推回堆栈。

  4. 如果你绝对不想使用列表,你可能会发现这个解决方案很有趣。 (从here偷来):

    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);
        }
    } 
    

答案 2 :(得分:1)

你可以做的是..使用递归,递归弹出堆栈中的元素,然后找到插入当前元素的最佳位置。如果您需要代码,请告诉我,但是如前面的评论:)中提到的那样排序堆栈是完全没有根据的::)

答案 3 :(得分:0)

我写了这个函数来使用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;

}