Programma semplice con lo stack

di il
2 risposte

Programma semplice con lo stack

Salve a tutti . Per esercizio ho creato un programma che legge in input una serie di parentesi (che possono essere sia tonde che graffe) e controlla se sono accoppiate ed annidate correttamente.

L'esercizio prevede l'uso di uno stack ().

Credevo di cavarmela in pochi minuti e in effetti c'ho messo poco per stilarlo ... eppure c'è un errore ed è tutto il giorno che lo cerco ma non riesco a trovarlo . Ecco il mio programma:

/*********************************************************************
* 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 azzera 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];
    }
}

2 Risposte

  • Re: Programma semplice con lo stack

    Ciao c:
    Ho trovato due errori:
    
    Bool is_empty(void)
    {
        if (top == 0) {
            return true;
        } //Else?
    }
    
    Questa funzione ritorna SEMPRE true perché non è mai specificato un altro return.
    La versione corretta, semplicemente, è
    
    Bool is_empty(void)
    {
        if (top == 0) {
            return true;
        }
        return false;
    }
    
    Stessa cosa per il secondo errore:
    
    Bool is_full(void)
    {
        if (top == (STACK_SIZE - 1)) {
            return true;
        } //Else?
    }
    
    Anche qui basta aggiungere il "return false;":
    
    Bool is_full(void)
    {
        if (top == (STACK_SIZE - 1)) {
            return true;
        }
        return false;
    }
    
    Di fatto ci eri arrivato, fai solo attenzione a questi errori che, per quanto piccoli, come vedi sballano totalmente i risultati :/
  • Re: Programma semplice con lo stack

    Porca miseria, e chi lo vedeva ! Meno male che avevo scritto pure nella descrizione che doveva restituire falso se la prima condizione non fosse verificata eppure l'avrò letto 50 volte e non me ne accorgevo

    Grazie mille

    Roba da prendermi a schiaffi. Ciao... vado a punirmi con il cilicio.
Devi accedere o registrarti per scrivere nel forum
2 risposte