Gli esercizi
Testi e soluzioni di alcuni esercizi
Stringhe ben parentesizzate
/*
** parentesi.c
**
** Si consideri un linguaggio nel quale si dispone di tre paia di parentesi,
** utilizzate per delimitare parti di testo (come ad esempio le parentesi
** graffe e tonde nel linguaggio C). Si supponga che queste tre paia di
** parentesi siano le parentesi tonde "(" e ")", le parentesi quadre "[" e "]"
** e le parentesi graffe "{" e "}".
**
** Si scriva un programma che chiede in input una stringa, ne memorizza i
** singoli caratteri in una lista e verifica se la stringa digitata
** inizialmente e' "ben parentesizzata".
**
** Marco Liverani (liverani@mat.uniroma3.it) - Giugno 2001
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX 100
struct nodo {
char info;
struct nodo *next;
};
struct nodo *costruisci_lista(char s[]) {
struct nodo *p, *primo=NULL;
int i;
for (i=0; i<strlen(s); i++) {
p = (struct nodo *) malloc(sizeof(struct nodo));
p->info = s[i];
p->next = primo;
primo = p;
}
return(primo);
}
int parentesi(struct nodo *p) {
int cont1=0, cont2=0, cont3=0;
while (p!=NULL && cont1>=0 && cont2>=0 && cont3>=0) {
if (p->info == ')')
cont1++;
if (p->info == '(')
cont1--;
if (p->info == ']')
cont2++;
if (p->info == '[')
cont2--;
if (p->info == '}')
cont3++;
if (p->info == '{')
cont3--;
p=p->next;
}
if (cont1 != 0 || cont2 != 0 || cont3 != 0)
return(0);
else
return(1);
}
int main(void){
char s[MAX];
int n;
struct nodo *primo;
printf("Digitare una stringa di caratteri:\n");
scanf("%s", s);
primo = costruisci_lista(s);
if (parentesi(primo))
printf("La parola %s e' ben parentesizzata.\n", s);
else
printf("La parola %s NON e' ben parentesizzata.\n", s);
return(0);
}