Balanceamento de parênteses utilizando Pilha

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

[ Hits: 6.695 ]

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

SIV - Simple Image Visualizer

Exceções em C através de try-throw-catch

Números Pseudos Aleatórios

Alocando espaço para uma matriz dinamicamente

Matrizes esparsas, produto por escalar e produto por um vetor


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário