Pilha

Problema 1068

Descrição

Dada uma expressão qualquer com parênteses, indique se a quantidade de parênteses está correta ou não, sem levar em conta o restante da expressão. Por exemplo:

a+(b*c)-2-a está correto (a+b*(2-c)-2+a)*2 está correto

enquanto

(a*b-(2+c) está incorreto 2*(3-a)) está incorreto )3+b*(2-c)( está incorreto

O seja, todo parênteses que fecha deve ter um outro parênteses que abre correspondente e não pode haver parênteses que fecha sem um previo parenteses que abre e a quantidade total de parenteses que abre e fecha deve ser igual.

Entrada

Como entrada, haverá N expressões (1 <= N <= 10000), cada uma delas com até 1000 caracteres.

Saída

O arquivo de saída deverá ter a quantidade de linhas correspondente ao arquivo de entrada, cada uma delas contendo as palavras correct ou incorrect de acordo com as regras acima fornecidas.

Exemplo de Entrada ------ Exemplo de Saída

a+(b*c)-2-a ---------- correct (a+b*(2-c)-2+a)*2 ---- correct (a*b-(2+c) ----------- incorrect 2*(3-a)) ------------- incorrect )3+b*(2-c)( ---------- incorrect

Código

#include <stdlib.h> #include <string.h> #include <iostream> using namespace std; #define INTOBJ 11 #define REALOBJ 12 #define STROBJ 13 #define LISTOBJ 16 #define CELLinum xpr.inum #define CELLrnum xpr.rnum #define CELLstr xpr.str #define ISint(p) ((p)->flag == INTOBJ) #define ISreal(p) ((p)->flag == REALOBJ) #define ISstr(p) ((p)->flag == STROBJ) #define ISlist(p) ((p)->flag == LISTOBJ) #define CAR(p) ((p)->xpr.pair.car) #define CDR(p) ((p)->xpr.pair.cdr) typedef struct cell { int flag; union { int inum; float rnum; char *str; struct { struct cell *car; struct cell *cdr; } pair; } xpr; }*sexpr; sexpr freshcell () { sexpr obj; obj = (sexpr) malloc(sizeof(struct cell)); return obj;} sexpr mkstr(char *str) { sexpr obj= freshcell(); char *newstr; int len= strlen(str); newstr= (char *) malloc (len+1); strcpy(newstr, str); *(newstr+len) = 0; obj->flag= STROBJ; obj->CELLstr= newstr; return obj;} sexpr mkrnum(float rnum) { sexpr obj= freshcell(); obj->flag= REALOBJ; obj->CELLrnum= rnum; return obj;} sexpr mkinum(int inum) { sexpr obj= freshcell(); obj->flag= INTOBJ; obj->CELLinum = inum; return(obj);} sexpr cons(sexpr head, sexpr tail) { sexpr obj= freshcell(); obj->flag = LISTOBJ; CAR(obj) = head; CDR(obj) = tail; return obj;} int main(){ sexpr abre; int i,cont; char xpr[1000], c; while(cin>>xpr){ abre=NULL; i=0; cont=0; while(xpr[i]!='\0'){ if(xpr[i]=='('){ abre=cons(mkinum(1),abre); } if(xpr[i]==')'){ if(abre==NULL){ cont=1; goto B; } else{ abre=CDR(abre); } } i++; } B: if(abre==NULL&&cont==0){ cout<<"correct\n"; } else{ cout<<"incorrect\n"; } } A: return 1; }


Observações e explicações