Balanceamento de parênteses utilizando Pilha

Publicado por Andrey (última atualização em 21/06/2016)

[ Hits: 7.421 ]

Homepage: https://github.com/andreycdias

Download balancing parenthesis_stack.c




Simples código que utiliza da estrutura de dados pilha, para verificar uma expressão e retornar se é ou não balanceada.

Outros códigos meus: https://github.com/andreycadima/C

  



Esconder código-fonte

/*
   simple code that verify if the expression is balanced or not;
   -works only for parenthesis-
   data struct used : stack;
   andrey cadima 2016
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct nodestack{
    char data;
    struct nodestack*next;
}nodes;
typedef struct nodestack*stack;


stack*create(){
    stack*S = (stack*)malloc(sizeof(stack));
    if(!S){
        printf ("\n memory not available;\n");
        exit(1);
    }else{
        *S = NULL;
        return S;
    }
}
int empty(stack*S){
    if(S==NULL) return 1;
    if(*S==NULL) return 1;
    else return 0;
}
nodes* allocate(char exp){
   nodes*no = (nodes*)malloc(sizeof(nodes));
   if(!no)
      exit(1);
   else{
      no->data = exp;
      no->next = NULL;
      return no;
   }
}
void push (stack*S, char exp){
   nodes*no = allocate(exp);
   nodes*tmp = *S;

   *S = no;
   no->next = tmp;
}
void pop (stack*S){
   nodes*tmp = *S;
   *S = tmp->next;
}
void release(stack*S){
   if(empty(S))
      return ;
   else{
      nodes*next_node,
          *cur_node;

      cur_node = *S;
      while(cur_node!=NULL){
         next_node = cur_node->next;
         free(cur_node);
         cur_node = next_node;
      }
   }
   *S = NULL;
}
void expression(stack*S){
    int i;
   char exp[50];

   loop:
   printf ("\nexpression: ");
   scanf ("%s", exp);

   //for(i=0;i<'\0';i++){
   for(i=0;i<strlen(exp);i++){
      if(exp[i]=='(') push (S, exp[i]);
      if(exp[i]==')'){
         if(empty(S))
            goto label;
         else
            pop (S);
      }
   }
   if(empty(S))
      printf ("\n balanced expression;\n");
   else
      label:
      printf ("\n unbalanced expression;\n");

   char opt;
   printf ("\ndo again? y/n: ");
   scanf ("%s", &opt);
   fflush(stdin);
   if(tolower(opt)=='y'){
      if(!empty(S))
         release(S);
      goto loop;
   }else
      exit(1);
}
int main (void){
    stack*S = create();
    expression(S);
    return 0;

}

Scripts recomendados

Biller

Validador de CPF

Teoria do Caos - (Equação Logística)

Método da bissecção

Converçor de Decimal para Binario


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts