从堆栈弹出时输出错误

时间:2013-05-28 18:04:37

标签: c structure stack

我使用堆栈制作了一个程序,但是我得到的输出有点不对。我得到的输出,我有我需要的答案,也有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));
    }
}

我得到的输出如下: enter image description here

如您所见,它首先打印2和1。什么似乎是问题?

2 个答案:

答案 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并按顺序弹出。