Buscar

Implementação de Pilha dinâmica em C

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

/*
	Implementação de uma pilha dinâmica
	Autor: Igor S O Cardoso.
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct elemento {
	int dado;
	struct elemento *proximo;
}t_elemento;
typedef struct pilha{
	t_elemento *primeiro;
	t_elemento *ultimo;
}t_pilha;
t_pilha* criaPilha() {
	t_pilha *pilha = (t_pilha*)malloc(sizeof(t_pilha));
	pilha->primeiro = NULL;
	pilha->ultimo = NULL;
	return pilha;
}
/*void empilhar(char valor, t_pilha *pilha){//Minha funçaõ de emplilhar
 t_elemento * novoprimeiro = (t_elemento *)malloc(sizeof(t_elemento));
 novoprimeiro->dado = valor;
 novoprimeiro->proximo = pilha->primeiro;
 pilha->primeiro = novoprimeiro;
 if(pilha->ultimo == NULL){
 pilha->ultimo = novoprimeiro;
 }
}*/
void empilhar(char valor, t_pilha *pilha) {
	t_elemento *novo = (t_elemento*)malloc(sizeof(t_elemento));
	novo->dado = valor;
	novo->proximo = NULL;
	if(pilha->primeiro == NULL) { //Se a lista estiver vazia
		pilha->primeiro = novo;
	}else {
		novo->proximo = pilha->primeiro;
		pilha->primeiro = novo; /*Meu pilha->primeiro aponta para o novo, e 
		novo passa a ser o primeiro elemento da pilha*/
	}
}
int desempilha(t_pilha *pilha) {/* Recebe só a pinha como argumento, pois o elemento a 
								ser sempilhado(excluido) é sempre o primeiro*/
	int primer = pilha->primeiro->dado;
	t_elemento *removido;
	removido = pilha->primeiro;
	pilha->primeiro = pilha->primeiro->proximo; /*Meu pilha->primeiro aponta para o meu proximo.
												Primeiro elemento (topo da pilha) passa a 
												ser o meu proximo elemento (que estava de baixo).*/
	free(removido); /*Remove o ex-topo da pilha.*/
	if(pilha->primeiro == NULL) {
		pilha->ultimo = NULL;
	}
	return primer; /*Retorna o elemento que foi removido da pihla, ou seja, o ex-topo da pilha*/
}
void Destruir(int t, t_pilha *pilha) {
	while(t--) {
		t_elemento *removido;
		removido = pilha->primeiro;
		pilha->primeiro = pilha->primeiro->proximo;
		free(removido);
	}
	if(pilha->primeiro == NULL) {
		pilha->ultimo = NULL;
	}
}
int esta_vazia(t_pilha *pilha) { /*Verifica se o topo da pilha esta vazio, caso sim, a pilha esta vazia*/
	if(pilha->primeiro == NULL) {
		printf("Pilha esta fazia!\n");
		return 1;
	}else {
		return 0;
	}
}
int tamanho_pilha(t_pilha *pilha) { /*Tanto faz passar o endereço ou uma copia da pilha*/
	t_elemento *aux = pilha->primeiro;
	int tamanho = 0;
	while(aux != NULL) {
		aux = aux->proximo; //Vai "andando" pela pilha
		tamanho++;
	}
	return tamanho;
}
void imprimir(t_pilha *pilha){
 t_elemento *atual = pilha->primeiro;
 
 while(atual != NULL){
 printf("%d ",atual->dado);
 atual = atual->proximo;
 }
 printf("\nFIM DA PILHA\n");
}
void menu() {
	printf("PILHA DINAMICA\n");
	printf("1) Inserir\n");
	printf("2) Remover\n");
	printf("3) Imprimir\n");
	printf("4) Tamanho\n");
	printf("5) Destruir\n");
	printf("0) Sair\n");
}
int main(void) {
	int opcao = 1, quantidade, elemento;
	t_pilha *pilha = criaPilha();
	while(1) {
		menu();
		printf("Digite a opecao: ");
		scanf("%d", &opcao);
		//system("cls");
		if(opcao == 0){
			quantidade = tamanho_pilha(pilha);
			Destruir(quantidade, pilha);
			printf("Bay Bay!\n");
			break;
		}
		else if(opcao == 1) {
			printf("Quantidade de elemento(s): ");
			scanf("%d", &quantidade);
			while(quantidade--) {
				printf("Digite o elemento: ");
				scanf("%d", &elemento);
				empilhar(elemento, pilha);
			}
		}
		else if(opcao == 2) {
			printf("Removendo...\n");
			printf("Elemento removido: \n", desempilha(pilha));
		}
		else if(opcao == 3) {
			printf("Pilha: ");
			imprimir(pilha);
		}
		else if(opcao == 4) {
			if(esta_vazia(pilha) == 0) {
				printf("Tamanho da pilha: %d\n", tamanho_pilha(pilha));
			}
		}
		else if(opcao == 5) {
			quantidade = tamanho_pilha(pilha);
			Destruir(quantidade, pilha);
			esta_vazia(pilha);
		}
	}
	quantidade = tamanho_pilha(pilha);
	Destruir(quantidade, pilha);
	esta_vazia(pilha);
	return 0;
}

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando