对堆栈进行排序

发布于 2024-11-09 08:28:42 字数 63 浏览 0 评论 0原文

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

I know how to sort an array but I haven't sorted a stack before.
So please help. How can I sort a stack using the quicksort algorithm?
Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

Spring初心 2024-11-16 08:28:42

“对堆栈进行排序”是什么意思?堆栈的整体思想是遵循后进先出 (LIFO) 顺序。使用堆栈的事物期望它们放入堆栈的最新事物将位于堆栈的顶部,较旧的事物位于其下方,按照它们插入的时间反向排序,因为这就是堆栈。如果你对堆栈进行排序,你就会破坏它。

What do you mean by "sorting a stack"? The whole idea of a stack is that it is in last-in, first-out (LIFO) order. Things that use stacks expect the most recent thing they put on the stack will be at the top of the stack with older things below it, ordered in reverse by when they were inserted because that's what stacks are. If you sort the stack you're going to break that.

行至春深 2024-11-16 08:28:42

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

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

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

如果您绝对不想使用列表,您可能会发现这个解决方案很有趣。 (盗自此处):

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

I know how to sort an array but I haven't sort stack before.

The most efficient solution is probably to change the data structure to a list which allows random access and then sort the list. I.e., something like this:

  1. Pop all elements of the stack into an array
  2. Use the algorithm you do know and sort the array.
  3. Push all elements back into the stack.

If you absolutely don't want to use a list, you'll perhaps find this solution interesting. (Stolen from 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);
    }
} 
梦里南柯 2024-11-16 08:28:42

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

What you can do is.. use recursion, recursively pop the elements in the stack and then find the best place to insert the current element. Let me know if you need the code, but then sorting a stack is totally unwarranted as mentioned in the earlier comments :) :)

千秋岁 2024-11-16 08:28:42

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

}

I wrote this function to sort the stack using O(n) space. This works perfectly fine. I would appreciate any improvements in time. It's O(n*n) right now.

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;

}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文