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

排序堆栈时没有输入

陶飞英
2023-03-14

有3个堆栈-A、B、C

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

推,弹出,顶,is_empty,创建

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

我有算法:

Compare top of A with top of B

弹出最小的元素并推送到堆栈C

重复步骤2,直到任何堆栈(A或B)变空

将剩余元素从非空堆栈移动到C。现在你有了C中的所有元素,但顺序是升序。(这是最重要的元素)。

将所有元素从C移动到A。(A中的内容按降序排列)

将所有元素从A移到B。(B中的内容按升序排列)

将所有元素从B移动到C。

这里是代码:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define MAX_MEMBERS 4
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 push(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)
{
int i;
    ITEM y,x;
    while(!is_empty(a)||!is_empty(b))
    {

y=top(a);
x=top(b);

  if(&y>&x)
   {
    push(c,&x);
    pop(b);
   }
  else
    {
     push(c,&y);
         pop(a);

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

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

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

while(!is_empty(a))
{
x=pop(a);
push(b,&x);
}

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

for(i=0;i<MAX_MEMBERS-1;i++)
printf("%d",c->a[i]);
}

void main(void)
{
 int i;
STACK a,b,c;
ITEM x;
create_stack(&a);
create_stack(&b);
create_stack(&c);

 for(i=0;i<4;i++)
 {
printf("\nEnter a number to insert for A: ");
scanf("%d",&x.num);
push(&a,&x);
 }

 for(i=0;i<4;i++)
 {
printf("\nEnter a number to insert for B: ");
scanf("%d",&x.num);
push(&b,&x);
 }

    sort(&a,&b,&c);

}

调试了代码,发现问题出在哪里。。它在这里:如果(

共有1个答案

乔伯寅
2023-03-14

因为比较的是变量的地址,而不是变量本身

 类似资料:
  • 在这个程序中,我必须打开一个文件并将其打印到文本区域,然后确保所有括号、括号等匹配。如果括号匹配,我将在另一个文本区域中打印出来。我的问题如下:我是从文件中读取还是从第一个文本区域读取?我是在Actionlistener还是在构造函数中创建堆栈?

  • 给定一个堆栈,任务是对它进行排序,使堆栈的顶部具有最大的元素。 示例1: 输入:堆栈:3 2 1输出:3 2 1示例2: 输入:堆栈:11 2 32 3 41输出:41 32 11 3 2 您的任务: 预期时间复杂度:O(N*N)预期辅助空间:O(N)递归。 约束:1

  • 以下是完整的问题: 编写一个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} 我写的代码是这样的: 你怎么认为?

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码:

  • 我正在阅读《破解编码面试》一书,遇到了一个问题:“编写一个程序,按升序对堆栈进行排序。您可以使用其他堆栈来保存项目,但不能将元素复制到任何其他数据结构(如数组)中。堆栈支持以下操作:push、pop、peek、isEmpty。” 这本书用O(n^2的时间复杂度和空间复杂度给出了答案。 但是,我偶然发现了这个博客,它使用快速排序方法在O(n log n)时间复杂性中提供了答案。 我想知道的是空间复杂

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