Corso di Informatica Generale - Primo modulo IN1

Testi e soluzioni di 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(1);
}

Per informazioni e commenti: liverani@mat.uniroma3.it - Torna alla Home page - Ultima modifica: 13 giugno 2001