LabASD - Parentesi bilanciate

Moreno Marzolla moreno.marzolla@unibo.it

Ultimo aggiornamento: 2022-05-08

Scrivere un programma che legge da un file, il cui nome viene passato come unico parametro sulla riga di comando, una sequenza di righe, ciascuna contenente una stringa di caratteri di lunghezza massima (LEN-1), dove LEN è un simbolo definito nel codice fornito. Per ciascuna riga, il programma deve controllare se le parentesi eventualmente presenti sono bilanciate oppure no. Nel caso in cui le parentesi siano bilanciate, il programma stampa BILANCIATE, altrimenti stampa NON BILANCIATE. La stringa vuota si considera bilanciata.

I tipi di parentesi da considerare sono ([{}]), e possono essere tra loro annidate in qualunque ordine. Alcuni esempi:

Input Output
abcdef BILANCIATE
AB[(2x)cd()]eF2() BILANCIATE
{a+b}*(a-(b+f+g-(g/h)/(2*g))) BILANCIATE
(((())))efGH2x(*)) NON BILANCIATE
(ab(cd(e(f*g))) NON BILANCIATE
)[] NON BILANCIATE
(a[b((c+d)-e)[f]]+h{n-1}) BILANCIATE
([{abcd}][]{}{aaa*b} NON BILANCIATE

Dato che le righe del file possono contenere spazi, per leggerle correttamente occorre usare la funzione di libreria

char *fgets(char *s, int size, FILE *stream)

che legge dal file stream una sequenza di al più size caratteri e la memorizza nel buffer puntato da s, che deve essere già stato allocato dal chiamante. La lettura si interrompe se viene raggiunta la fine del file oppure un ritorno a capo; il terminatore viene aggiunto automaticamente al termine del buffer. La funzione ritorna un puntatore al buffer s.

Per compilare:

    gcc -std=c90 -Wall -Wpedantic parentesi.c -o parentesi

Per eseguire:

    ./parentesi parentesi.in

File