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