2 votes

Sortie erronée lors de l'extraction de la pile.

J'ai fait un programme en utilisant des piles, mais la sortie que j'obtiens est un peu fausse. La sortie que j'obtiens, a la réponse dont j'ai besoin et a également 2 valeurs qui ne sont pas attendues.

Voici ce que j'ai fait :

#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));
    }
}

La sortie que j'obtiens est la suivante : enter image description here

Comme vous pouvez le voir, il imprime d'abord 2 et 1. Quel semble être le problème ?

3voto

Deepu Points 4451

A mon avis, votre programme fonctionne comme suit,

La boucle suivante essaie d'insérer 40 valeurs,

for(;i<10;i++)
{
   push(&s,theorder->spongecake);
   push(&s,theorder->meringue);
   push(&s,theorder->chocalate);
   push(&s,theorder->red_velvet);
}

Mais seulement 10 valeurs sont insérées à cause de votre déclaration if(q->top==10-1) dans votre isFull() c'est-à-dire que le compteur compte 10 éléments de 0 à 9. L'ordre dans lequel les éléments sont poussés est le suivant 1, 2, 3, 4, 1, 2, 3, 4, 1, 2 . Ces éléments, lorsqu'ils sont mélangés, donnent la séquence 2, 1, 4, 3, 2, 1, 4, 3, 2, 1 . Ainsi, le résultat que vous obtenez est en fait correct ou du moins n'est pas une aberration.

Il y a quelques autres points que je voudrais souligner,

La fonction pop() devrait être le suivant,

 int pop(struct stack *sptr)
 {
    int ret=NULL;
    if(!isEmpty(sptr))
    {
        ret=sptr->cake[sptr->top];
        sptr->top--;
        return ret;
    }
    return 0;
 }

Sinon, la fonction renvoie des valeurs aléatoires lorsque sptr est vide.

La déclaration if(q->top==10-1) devrait être if(q->top==9) .

2voto

srt10 Points 95

Il n'y a pas de problème avec la pile, à l'exception de l'implémentation pop où la valeur de retour NULL est renvoyée lorsque la pile est vide. Mieux vaut retourner un nombre invalide par convention (comme 0, -1, -999), à vous de choisir.

Comme vous limitez la taille de la pile à 10, seules 10 valeurs sont insérées. Ainsi, lors de l'insertion, seules les valeurs suivantes sont insérées : 1 2 3 4 1 2 3 4 1 2 et sont retirées dans l'ordre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X