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