当前位置: 首页 > 知识库问答 >
问题:

使用structs对两个堆栈进行排序

吉凯捷
2023-03-14

有3个堆栈-A、B、C

堆栈A和B被排序(堆栈顶部的数字最大)。堆栈C为空,仅允许5次操作:

推,弹出,顶,is_empty,创建

我们需要编写一个函数来接收堆栈A和B,将堆栈A和B中的所有数字移动到堆栈C,堆栈C必须排序(最大数字在顶部)。

我有算法:

比较A的顶部和B的顶部

Pop the least element and push to stack C

Repeat step 2 until any of the stack ( A or B) becomes empty

Move remaining elements from non-empty stack to C. Now you have all the elements in C  but in ascending order. (That is least element at top).

Move all the elements from C to A. (Contents in A are in descending order)

Move all the elements from A to B. (Contents in B are in ascending order)

Move all the elements from B to C.

我开始写代码,但有错误,我不知道为什么!

代码:

#include <stdio.h> 
#include <stdlib.h>
#include <conio.h>
#define MAX_MEMBERS 10
typedef struct
{
    int num;
}ITEM;

typedef struct
{
    ITEM a[MAX_MEMBERS];
    int top;
}STACK;

void create_stack(STACK *s)
{
    s->top=-1;
}

int is_empty(STACK *s)
{
    return s->top==-1;
}

int is_full(STACK *s)
{
    return s->top==MAX_MEMBERS-1;
}

ITEM pop(STACK *s)
{
    return s->a[s->top--];
}

void (STACK *s,ITEM *item)
{
    s->a[++s->top]=*item;
}

ITEM top(STACK *s)
{
    return s->a[s->top];
}

void sort (STACK *a,STACK *b,STACK *c)
{
    while(!is_empty(&a)||!is_empty(&b))
        if(top(&a)>top(&b))
            push(&c,pop(&b));

    if(!is_empty(&a))
    {
        while(!is_empty(&a))
            push(&c,pop(&a));
    }

    else
    {
        while(!is_empty(&b))
            push(&c,pop(&b));
    }

    while(!is_empty(&c))
        push(&a,pop(&c));

    while(!is_empty(&a))
        push(&b,pop(&a));

    while(!is_empty(&b))
        push(&c,pop(&b));

}

void main(void)
{
    STACK a,b,c;
    create_stack(&a);
    create_stack(&b);
    create_stack(&c);
    sort(&a,&b,&c);
}

共有1个答案

宋俊艾
2023-03-14

您应该弹出最高的元素并将其推到C。

要将所有元素按相反的顺序推送到C上,您需要C底部的最高元素(必须首先推送此值)。如果一个

无论如何,你的代码似乎不是很安全。请看以下内容:

while(!is_empty(&a)||!is_empty(&b))
    if(top(&a)>top(&b))

假设a是空的,b不是空的,因此a.top等于-1,b.top在0到MAX_成员-1的范围内。由于其中一个堆栈不是空的,因此该条件为真。通过呼叫top(

返回一个[-1]//错误:索引超出范围

This is how your code is resolved.
is_empty(&a) returns true
!is_empty(&a) returns false
(false || true) returns true

while(false || true)
    if( top(&a) > top(&b) )

无论如何,我怀疑你的代码是否能编译。

void (STACK *s,ITEM *item)
{
    s->a[++s->top]=*item;
}

这应该是:

void push(STACK *s,ITEM *item)
{
    s->a[++s->top]=*item;
}

同时考虑:

void main(void)
{
    STACK a,b,c;
    create_stack(&a); //stack a is created, contains no elements
    create_stack(&b); //stack b is created, contains no elements
    create_stack(&c); //stack c is created, contains no elements
    sort(&a,&b,&c); //sort which elements of the stack?
}
 类似资料:
  • 有3个堆栈-A、B、C 堆栈A和B被排序(堆栈顶部的数字最大)。堆栈C为空,仅允许5次操作: 推,弹出,顶,is_empty,创建 我们需要编写一个函数来接收堆栈A和B,将堆栈A和B中的所有数字移动到堆栈C,堆栈C必须排序(最大数字在顶部)。 我有算法: 比较A的顶部和B的顶部 弹出最小的元素并推送到堆栈C 重复步骤2,直到任何堆栈(A或B)变空 将剩余元素从非空堆栈移动到C。现在你有了C中的所有

  • 我试图理解使用中给出的递归对堆栈元素进行排序http://www.geeksforgeeks.org/sort-a-stack-using-recursion/不允许使用while、for…等任何循环结构。我们只能在堆栈S上使用以下ADT函数: is_empty(S):测试堆栈是否为空。 push(S) :向堆栈添加新元素。 Pop(S):从堆栈中删除顶部元素。 top(S) :返回 top 元素

  • 输入=堆栈数 但是你只能弹出输入,你不能推到它。输出也是另一个堆栈,你可以返回并推到它,但不能弹出 所以如果 由于您无法在中返回到

  • 以下是完整的问题: 编写一个java方法,它将接受两个排序后的堆栈a和B(最小值在顶部),并返回一个排序后的堆栈D(最小值在顶部)。只允许使用堆栈操作,如pop、push、isEmpty和peek。 示例:假设A={(top)1,4,7,9}和B={(top)2,3,6},那么函数将返回一个新的堆栈D={(top)1,2,3,4,6,7,9} 我写的代码是这样的: 你怎么认为?

  • 我已经在Java和C中找到了这个问题的几个实现,但我还没有找到一个使用JavaScript的示例。这是一个相当常见的技术面试问题: 在2n空间中对堆栈进行排序。(仅使用2个堆栈对堆栈进行排序)

  • 我试图找出以下问题的最佳解决方案:给定一个范围为1-5的20个整数的堆栈,对堆栈进行排序,使只有1-4的值保持升序。您一次只能移动一个值。 我实现了一个迭代的 我应该考虑哪一种类型?我应该考虑哪些数据类型?对于给定的问题,最好的可能更坏的情况是什么O(?)?