Pilha

Publicado por Helton Barbosa Santos Ferreira 06/09/2006

[ Hits: 7.286 ]

Download exp.c




Esse código verifica uma expressão matemática. Ex: se o usuário digitar {1-[4*(2-3)-7]/10}, o programa verifica as chaves, colchetes e parênteses da expressão. Se em algum lugar da expressão o programa encontrar um erro do tipo, {1-[4*(2-3)-7]/10], observe que abre-se a chave, mas não tem fecha-chaves, no lugar tem um fecha-colchete, o programa acusa 'Expressão Incorreta!'. Esse código usa uma implementação de pilha. Feito às pressas, se alguém fizer uma implementação a mais, me comuniquem.

  



Esconder código-fonte

#include <stdio.h>
#include <malloc.h>

struct nodo
{
   char conteudo;
   struct nodo *anterior;
};

struct nodo *pilha;

void push(char valor)
{
   struct nodo *aux=(struct nodo*) malloc(sizeof(struct nodo));
   aux->conteudo=valor;
   if (pilha==NULL)
   {
      aux->anterior=NULL;
   }
      else
   {
      aux->anterior=pilha;
   }
      pilha=aux;
}

char top()
{
    return pilha->conteudo;
}

void listar()
{
    struct nodo *aux=pilha;
    if(pilha!=NULL)
    {
        do
        {
   printf("%c", aux->conteudo);
   aux=aux->anterior;
         }
   while(aux!=NULL);
     }
}
char pop()
{
   struct nodo *aux=pilha;
   pilha=pilha->anterior;
   char a=aux->conteudo;
   free(aux);
   return a;
}
int le(char *a, int m)
{
   int i=0;
   char c;
   c=getchar();
   while(c!='\n')
   {
      a[i]=c;
      i++;
      c=getchar();
   }
   a[i]='{FONTE}';
   i=0;
   if (i>m)
   {
      return(1);
   }
}
void desaloca()
{
   if(pilha!=NULL)
   {
      struct nodo *aux;
      do
      {
         aux=pilha;
         pilha=pilha->anterior;
         free(aux);
      }
      while(pilha!=NULL);
   }
}
main()
{
   
   pilha=NULL;
   char exp[50];
   //system("clear");
   printf("PROGRAMA PARA VERIFICAR EXPRESSAO MATEMATICA\n\n\n");
   printf("Digite Uma Expressao: Ex.: 1-{2+[9*1(1-3)-5]/4}\n\n");
   le(exp,50);
   char retorno;
   int i, tam=strlen(exp);
   for(i=0; i<tam; i++)
   {
   if((exp[i]=='(')||(exp[i]=='[')||(exp[i]=='{'))
      push(exp[i]);
   else
   {
      if(exp[i]==')'||exp[i]==']'||exp[i]=='}')
      {
         if(exp[i]==')')
         {
         retorno=pop();
         if(retorno!='(')
         {
         printf("Expressao Incorreta!\n");
         i=tam;
                        getchar();
                        getchar();
      }
      else if(retorno=='(')
         {            printf("Expressao Correta!\n");
                  i=tam;
                  getchar();
                        getchar();
      }
      }
      else if(exp[i]==']')
      {         
   retorno=pop();
   if(retorno!='[')
   {
      printf("Expressao Incorreta!\n");
      i=tam;
      getchar();
                         getchar();
      }
         else if(retorno=='[')
               {
         printf("Expressao Correta!\n");
                  i=tam;
                  getchar();
                        getchar();
         }
      }
      else if(exp[i]=='}')
      {
         retorno=pop();
         if(retorno!='{')
         {
         printf("Expressao Incorreta!\n");
         i=tam;
                  getchar();
                        getchar();
         }
      else if(retorno=='{')
      {                  printf("Expressao Correta!\n");
                  i=tam;
                  getchar();
                        getchar();
         }
         }
         }
      }
   }
   desaloca();
}

Scripts recomendados

Jogo de 21 em C

Lista dinâmica de variáveis

livraria

Biblioteca ctype.h

Rotina para controle de portas paralelas em C.


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário