有3个堆栈 - A,B,C
堆栈A和B已排序(堆栈顶部的数字最大)。堆栈C为空仅允许5个操作:
push,pop,top,is_empty,create
我们需要编写一个接收堆栈A和B的函数,将堆栈A和B中的所有数字移动到堆栈C,堆栈C必须排序(最大数字在顶部)。
我有算法:
将A的顶部与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 8
typedef struct
{
int x[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;
}
int pop(STACK *s)
{
return s->x[s->top--];
}
void push(STACK *s,int item)
{
s->x[++s->top]=item;
}
int top(STACK *s)
{
return s->x[s->top];
}
void ex1(STACK *a, STACK *b)
{
STACK c;
while(!is_empty(a)&&!is_empty(b))
{
if(top(&a)>top(&b))
push(&c,pop(&a));
else if(top(&a)<top(&b))
push(&c,pop(&b));
else
{
pop(&a);
push(&c,pop(&b));
}
}
if(is_empty(&a))
while(!is_empty(&b))
push(&c,pop(&b));
else while(!is_empty(&a))
push(&c,pop(&a));
while(!is_empty(&c))
push(&a,pop(&c));
while(!is_empty(&a))
push(&b,pop(&a));
while(!is_empty(&b))
push(&c,pop(&b));
}
main()
{
STACK a,b;
int i,x;
create_stack(&a);
create_stack(&b);
for(i=0;i<4;i++)
{
printf("enter a num for stack a :\n");
scanf("%d",&x);
push(&a,x);
printf("enter a num for stack b :\n");
scanf("%d",&x);
push(&b,x);
}
ex1(a,b);
}
答案 0 :(得分:0)
有很多错误,其中很多都归结为push
签名:
void push(STACK s,int item)
看起来应该是:
void push(STACK *s,int item)
其余的归结为不将STACK
结构的地址传递给您的函数,例如:
push(a,x);
应该是:
push(&a,x);
同样main
应始终返回int
:
int main()