我使用堆栈制作了一个程序,但是我得到的输出有点不对。我得到的输出,我有我需要的答案,也有2个不期望的值。
这就是我所做的:
#include <stdio.h>
#include<malloc.h>
#define MAX 180
struct cakes{
int spongecake;
int meringue;
int chocalate;
int red_velvet;
struct cakes *next;
};
struct stack{
int top;
int cake[10];
};
int isFull(struct stack *);
int isEmpty(struct stack *);
void push(struct stack *,int);
int pop(struct stack *);
void order_out(struct cakes *);
main()
{
struct cakes *head;
head=(struct cakes *)malloc(sizeof(struct cakes));
cake_order(head); //this is a seperate function, it works perfectly.
head->next=(struct cakes *)malloc(sizeof(struct cakes));
order_out(head->next);
}
int isFull(struct stack *q)
{
if(q->top==10-1)
{
return 1;
}
else
{
return 0;
}
}
void push(struct stack *sptr,int x)
{
if(!isFull(sptr))
{
sptr->top++;
sptr->cake[sptr->top]=x;
}
}
int isEmpty(struct stack *q)
{
if(q->top==-1)
{
return 1;
}
else
{
return 0;
}
}
int pop(struct stack *sptr)
{
int ret=NULL;
if(!isEmpty(sptr))
{
ret=sptr->cake[sptr->top];
sptr->top--;
return ret;
}
}
void order_out(struct cakes *theorder)
{
struct stack s;
s.top=-1;
int k=0;
int i=0;
int p=0;
int r=0;
int value1,value2;
int items[10];
theorder->spongecake=1;
theorder->meringue=2;
theorder->chocalate=3;
theorder->red_velvet=4;
for(;i<10;i++)
{
push(&s,theorder->spongecake);
push(&s,theorder->meringue);
push(&s,theorder->chocalate);
push(&s,theorder->red_velvet);
}
while(!isEmpty(&s))
{
printf("\n%d",pop(&s));
}
}
我得到的输出如下:
如您所见,它首先打印2和1。什么似乎是问题?
答案 0 :(得分:3)
在我看来,你的程序工作如下,
以下循环尝试插入40个值
for(;i<10;i++)
{
push(&s,theorder->spongecake);
push(&s,theorder->meringue);
push(&s,theorder->chocalate);
push(&s,theorder->red_velvet);
}
但由于if(q->top==10-1)
函数中的语句isFull()
,只插入了10个值。即计数器从0到9计数10个元素。按下元素的顺序如下1, 2, 3, 4, 1, 2, 3, 4, 1, 2
。弹出这些元素会为您提供序列2, 1, 4, 3, 2, 1, 4, 3, 2, 1
。因此,您获得的输出实际上是正确的,或者至少不是像差。
我还想指出一些问题,
函数pop()
应如下所示,
int pop(struct stack *sptr)
{
int ret=NULL;
if(!isEmpty(sptr))
{
ret=sptr->cake[sptr->top];
sptr->top--;
return ret;
}
return 0;
}
否则,当sptr
为空时,函数会返回随机值。
声明if(q->top==10-1)
应为if(q->top==9)
。
答案 1 :(得分:2)
除了pop实现,堆栈为空时返回NULL返回值没有问题。最好将无效数字返回给您选择的约定(如0,-1,-999)。
当您将堆栈大小限制为10时,仅插入10个值。因此,虽然只插入以下插入1 2 3 4 1 2 3 4 1 2并按顺序弹出。