
Go backward to Números aleatórios e simulações
Go up to Alguns exercícios a exemplos dados nas aulas teóricas
Go forward to Várias implementações do "stack"
"Stack" para testar a colocacao de parentesis
Nota: Uma solução mais simples consiste em contar da esquerda para a
direita a diferença entre o número de parêntesis abertos e fechados. A expressão
está "correcta" se esse valor é 0 no fim e nunca é nagativo durante o processo.
// -----------------------------------------------------------------------------
// Usa um stack para ver se a colocacao de parentesis
// numa formula esta' correcta
// Nota: não era necessário usar um stack, bastava um contador de ``(''
main(){
#define MAX 100
int testa(char *s);
char s[MAX];
printf(" ? ");
scanf("%s",s);
if(testa(s))
printf("Correcto!\n");
else
printf("Incorrecto!\n");
}
int testa(char *s){
void push(char c);
char pop(void);
int vazio(void);
int i;
for(i=0;i<strlen(s);i++){
if(s[i]=='(')
push(s[i]);
else
if(s[i]==')'){
if(vazio())
return(0);
else
pop(); // Valor desprezado, e' '('!
}
}
return(vazio());
}
// Stack: IMPLEMENTACAO COM UM VECTOR
#define MAX 100
char stack[MAX];
int sp=0;
void push(char c){
stack[sp++]=c;
}
char pop(void){
sp--;
return(stack[sp]);
}
// Alternativa:
// IMPLEMENTACAO COM LISTAS LIGADAS
struct no{
char caracter;
struct no * mais;
};
struct no * sp=NULL;
// Exercicio: use teste de existencia de memoria suficiente
void push(char c){
struct no * novo = (struct no *) malloc(sizeof(struct no));
novo->mais = sp;
novo->caracter = c;
sp = novo;
}
// Exercicio: usar teste de vazio e libertar espaco com free
char pop(void){
char c = sp->caracter; // valor a retornar;
sp = sp->mais;
return(c);
}
int vazio(void){
return(sp==NULL);
}
Resultados:
? 1
Correcto!
? (1)
Correcto!
? (())())
Incorrecto !
? (()))(
Incorrecto !
? (2*3+(4/5))
Correcto!
%
