Você está na página 1de 2

#include <stdio.

h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

// Estrutura de dados para representar um nó em uma pilha dinâmica


typedef struct Objeto{
int item;
struct Objeto* proximo;
} No; // Define um Nó para a pilha dinâmica

// Estrutura de dados para representar uma pilha dinâmica


typedef struct PilhaDinamica{
No *topo;
int tamanho;
} Pilha_D; // Declaração da pilha dinâmica

// Inicializa uma pilha, definindo o topo como nulo e o tamanho como zero
void inicializa(Pilha_D *pilha){
pilha->topo = NULL; // Define o topo como nulo
pilha->tamanho = 0; // Define o tamanho como zero se a pilha estiver vazia
}

// Adiciona um elemento à pilha


void push(Pilha_D *pilha, int item){
No *auxiliar = NULL; // Cria um Nó auxiliar para auxiliar na adição de
elementos na pilha
auxiliar = (No*) malloc (sizeof(No)); // Aloca espaço para o novo objeto
auxiliar->item = item; // Define o item do auxiliar como o item fornecido
auxiliar->proximo = pilha->topo; // Define o próximo do auxiliar como o topo
atual
pilha->topo = auxiliar; // Atualiza o topo da pilha para o auxiliar
}

// Remove um elemento da pilha


void pop (Pilha_D *pilha){
No* auxiliar = pilha->topo; // Define um Nó auxiliar como o topo da pilha
if(auxiliar == NULL) return; // Se o topo for nulo, retorna
pilha->topo = auxiliar->proximo; // Atualiza o topo da pilha para o próximo do
auxiliar
free(auxiliar); // Libera o espaço alocado pelo auxiliar
}

// Destrói a pilha, liberando todos os nós


void destroi (Pilha_D *pilha){
No* auxiliar = pilha->topo; // Define um Nó auxiliar como o topo da pilha
while(auxiliar != NULL){ // Enquanto o auxiliar não for nulo
pilha->topo = auxiliar->proximo; // Atualiza o topo da pilha para o próximo
do auxiliar
free(auxiliar); // Libera o espaço alocado pelo auxiliar
auxiliar = pilha->topo; // Atualiza o auxiliar para o novo topo da pilha
}
pilha->tamanho = 0; // Define o tamanho da pilha como zero
}

// Verifica se a sequência de caracteres fornecida possui os colchetes balanceados


int colchetes_balanceados(const char *exp, Pilha_D *pd){
int i; // Variável de controle do loop
for(i = 0; exp[i] != '\0'; i++){ // Percorre a string por completo
if(exp[i] == '(' || exp[i] == '[' || exp[i] == '{'){ // Se o caractere
atual for um colchete de abertura, adiciona à pilha
push(pd, exp[i]);
}else if(exp[i] == ')' || exp[i] == ']' || exp[i] == '}'){ // Se o
caractere atual for um colchete de fechamento
if(pd->topo == NULL){ // Se a pilha estiver vazia, os colchetes não
estão balanceados
return 0;
}
// Se o colchete atual corresponder ao topo da pilha, remove o colchete
do topo
if(exp[i] == ')' && pd->topo->item == '('){
pop(pd);
}else if(exp[i] == ']' && pd->topo->item == '['){
pop(pd);
}else if(exp[i] == '}' && pd->topo->item == '{'){
pop(pd);
}else{ // Se não corresponder, os colchetes não estão balanceados
return 0;
}
}
}
// Se a pilha estiver vazia no final, os colchetes estão balanceados
if(pd->topo == NULL) {
return 1;
}
return 0; // Caso contrário, os colchetes não estão balanceados
}

Você também pode gostar