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