[C] Programmino di uso dello stack

meganerd_II
Ciao. Ho provato in tutti i modi a trovare l'errore per non dover chiedere sempre aiuto qui sul forum, ma niente.

L'esercizio chiede di creare un programma che fa uso di uno stack (da implementare), per stabilire se una serie di parentesi inserite dall'utente sono o meno accoppiate correttamente.

L'implementazione dello stack dovrebbe essere corretta e il corpo del main è così banale che non capisco come fa ad essere sbagliato!

/*********************************************************************
* Il programma controlla che un gruppo di parentesi inserite da      *
* input siano state annidate correttamente.                          *
*********************************************************************/
//Direttive
#include <stdio.h>
#define true 1
#define false 0
#define STACK_SIZE 100

//Definizioni di tipo
typedef int Bool;

//Variabili esterne
int top = 0;
char contents[STACK_SIZE];

//Prototipi
void make_empty(void);
Bool is_empty(void);
Bool is_full(void);
void push(char x);
char pop(void);

//Main
int main(void)
{
    char ch;
    Bool risultato = true;

    printf("Inserisci le parentesi graffe e/o tonde\n");
    while ( (ch = getchar()) != '\n' ) {
        if ((ch == '(') || (ch == '{')) {
            push(ch);
        } else if (ch == ')' && pop() != '(' ) {
                risultato = false;
                break;
        } else if (ch == '}' && pop() != '{' ) {
                risultato = false;
                break;
        }
    }
    if (risultato == true && is_empty == true) {
        printf("Le parentesi sono annidate correttamente\n");
    } else {
        printf("Le parentesi non sono annidate correttamente\n");
    }

    return 0;
}

//Definizione delle funzioni
/********************************************************************
* make_empty: svuota lo stack.In realtà non azzerà gli elementi, ma *
*             riporta l'indicatore della cima allo stato iniziale,  *
*             in questo modo gli elementi vengono sovrascritti.     *
********************************************************************/
void make_empty(void)
{
    top = 0;
}

/********************************************************************
* is_empty: Restituisce true se è vuoto, false se è presente almeno *
*           un elemento.                                            *
********************************************************************/
Bool is_empty(void)
{
    if (top == 0) {
        return true;
    }
}

/********************************************************************
* is_full: Restituisce true se lo stack è pieno, false se non lo è. *                                      *
********************************************************************/
Bool is_full(void)
{
    if (top == (STACK_SIZE - 1)) {
        return true;
    }
}

/********************************************************************
* push: inserisce l'elemento x sulla cima dello stack.              *
********************************************************************/
void push(char x)
{
    if (is_full() == true) {
        printf("Errore: lo stack è pieno\n");
    } else {
        contents[top] = x;
        top += 1;
    }
}

/********************************************************************
* pop: restituisce l'elemento x che sta sulla cima dello stack.     *
********************************************************************/
char pop(void)
{
    if (is_empty() == true) {
        printf("Errore: lo stack è vuoto\n");
    } else {
        top -= 1;
        return contents[top];
    }
}

Risposte
apatriarca
Credo che il problema sia nel test is_empty == true. Sfortunatamente in questo caso i cast impliciti non ti vengono incontro. is_empty è infatti un puntatore a funzione e il suo valore può essere convertito in int e quindi confrontato senza problemi con true. Ma il valore di questo puntatore è quasi certamente diverso da 1. Il test corretto avrebbe dovuto essere is_empty() == true.

P.S. In realtà non c'è alcun reale bisogno di usare "== true" o "== false". Qualsiasi valore intero può essere usato come condizione (lo zero viene considerato falso e qualsiasi altro valore vero).

meganerd_II
I puntatori non li ho ancora fatti quindi non so nemmeno cosa sono :P.

Comunque scusa ma non ho capito. Mi sembra di capire che dovrei aggiungere le parentesi dopo is_empty (cioè scrivere così: is_empty() ), ma in effetti è proprio quello che ho scritto, non ho dimenticato di inserire le parentesi.

Comunque il fatto di true false lo sapevo ;) , li ho voluti inserire per controllare di non aver fatto errori perchè non trovavo il bug... anche perchè il tipo booleano l'ho definito "manualmente".

apatriarca
Nel main non le hai messe le parentesi.. Scusa, mi sono dimenticato di dirti a quale condizione mi riferivo.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.