Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

jacquel

Pilhas

Recommended Posts

** Estou precisando fazer um programa em C utilizando Pilha que tenha as seguintes funções:

 

1 - Converter uma expressão na forma Infixa para Posfixa (Notação Polonesa Reversa).

 

2 - Avaliar se uma expressão está correta, quanto aos parênteses e a posição dos operadores e operandos.

 

3- Adicionar funcionalidades à calculadora:

• # - raiz quadrada

• ^ - exponenciação

• % - resto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz a seguinte função para verificar se os parenteses de uma expressao infixa aparecem balanceados, entretanto ela só funciona para uma sequencia de parenteses.

 

Tipo: ( ( ) ) - ela retornará valor 1-correta

( ( () - ela retornará 0-errada

##PROBLEMA: (x+y) -> RETORNA 0 (MESMO ESTANDO CERTA)

 

 

int bemFormada (char inf[MAX])
{
   char *pilha; int t; 
   int n, i;
  
   n = strlen (inf);
   pilha = (char*)malloc(n * sizeof (char));
   t = 0;
   for (i = 0; inf[i] != '\0'; ++i) {
      // a pilha está armazenada em pilha[0..t-1]
      switch (inf[i]) {
         case ')': if (t != 0 && pilha[t-1] == '(') 
                      --t;
                   else return 0;
                   break;
         
         default:  pilha[t++] = inf[i];
      }
   }
   free (pilha);

   if (t == 0) return 1;
   else return 0; 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

Me parece que você esta construindo a pilha de um jeito errado, você esta empilhando todos os elementos sendo que só seria preciso armazenas os '(', acho que isso iria funcionar:

 

int bemFormada (char inf[MAX])
{
   char *pilha; int t; 
   int n, i;
  
   n = strlen (inf);
   pilha = (char*)malloc(n * sizeof (char));
   t = 0;
   for (i = 0; inf[i] != '\0'; ++i) {
      // a pilha está armazenada em pilha[0..t-1]
      switch (inf[i]) {
         case ')': if (t != 0 && pilha[t-1] == '(') 
                      --t;
                   else return 0;
                   break;
         
         case '(':  pilha[t++] = inf[i];
      }
   }
   free (pilha);

   if (t == 0) return 1;
   else return 0; 
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.