Sei sulla pagina 1di 10

Criando uma Pilha na Linguagem C/C++

Para criarmos uma pilha em C ou C/C++, devemos seguir a regra por LIFO (Last in, First out), isto , a regra em si manter a mesma ordem de entrada de elementos sempre um em cima do outro e s retirar os elementos por aqueles que esto no topo, exemplo:
Pilha (s) Inseres Remoes

3 2 1

Topo (Elemento do Fim) Incio (Elemento do Incio)

Para poder exemplificar em C ou C/C++ primeiro devemos ver o funcionamento das regras de insero de elementos e retiradas. Para isso temos um grfico abaixo que nos mostra como montar os nomes das funes dentro do programa com a pilha stacks: cria() - Criao da funo onde iniciara uma pilha vazia; push(s) Empilha elementos na pilha considerada como Insero; pop() Desempilha elementos da pilha considerada como Remoo; elemtopo() Acesso de elementos no topo, sem, contudo, remov-lo.

Iniciando a Construo do Programa Pilha.cpp

O cabealho dever ser mantido o mesmo em relao a pilha, exemplo: #include <iostream.h> #include <stdio.h> /* Para quem programa em C no Dev-C++ no windows, deve lembrar que para parar execuo lembre-se de usar uma das bibliotecas #include <conio.h> (Uso do getch() ou getche()) ou #include <stdlib.h> (Uso da funo system(pause)).

*/ #define MAX 6 #define MIN 1 /* O #define MAX 6 o mximo do tamanho da pilha. Quanto ao #define MIN 1 o mnimo o incio da pilha, portanto ela comeara em 1 at 6 exemplificado na figura no incio deste texto seis blocos da pilha */ typedef struct { int pos; float vetor[MAX]; }Pilha; /* Modifiquei a estrutura da pilha para esta que bem mais fcil de entender. Onde o principal tipo primitivo ser a Pilha. */ Pilha* cria(void); void push(Pilha* p, float s); float pop(Pilha* p); int stack(Pilha* p); /* Criao dos prottipos das funes da pilha. Porm, voc pode modificar seu programa e no programar com prottipo de funes. Por exemplo, s montar o programa principal a funo main(), logo aps as funes criadas. Ento primeiro estrutura, depois funes e por ltimo programa principal. */ Pilha* cria(void) {

Pilha* p=(Pilha*)malloc(sizeof(Pilha)); p->pos=MIN; return(p); } /* A funo Pilha* cria(void) est representada em vetor por Pilha*, onde teremos o deslocamentos dos elementos pelo seu mnimo. Iniciara a partir do MIN que igual a posio pos. Pois o operador de acesso a membros (->) conecta o endereo de uma estrutura a um membro dela. Portanto, p esta conectado em pos p->pos, retornando p. */ void push(Pilha* p, float s) { if(p->pos==MAX) { cout << "\n Capacidade da Pilha Estourou!"; exit(1); } p->vetor[p->pos]=s; p->pos++; } /* A funo void push(Pilha* p, float s), significa que faremos uma estrutura de deciso com if onde onde p->pos (conectados), esto recebendo somente o valor de MAX, seu nmero mximo na pilha. Portanto p->vetor[p->pos]=s, representa a pilha s com seu tamanha mximo do vetor no caso 6 seis posies vazias que sero empilhadas por push(s). */ float pop(Pilha* p) { float s;

if (stack_void(p)) { cout << "\n Pilha Vazia!"; exit(1); } s = p->vetor[p->pos - 1]; p->pos--; return(s); } A funo float pop(Pilha* p), significa que faremos uma estrutura de deciso com if onde onde chamando a int stack_void(Pilha* p) funo dentro do if, que verificar o retorno a posio do elemento topo da pilha. Portanto s = p->vetor[p->pos - 1], representa a pilha s onde o vetor conectado por (->) poder retirar posio do topo por pop(s) */ int stack_void(Pilha* p) { return(p->pos == MIN); }

/* Essa funo foi criada para conectar-se a push e pop somente para criao da pilha do nmero 1 ao 6 elementos da pilha vazia. */ main(void) { Pilha* pilha; int elem, opcao; char sair = 'n'; pilha = cria(); /* Chamada da funo Pilha* cria(void) */

do{ cout << "\n\t\t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%"; cout << "\n\t\t% MENU DA PILHA %";

cout << "\n\t\t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%"; cout << "\n\t\t% cout << "\n\t\t% 1 - Empilhar cout << "\n\t\t% 2 - Desempilhar cout << "\n\t\t% 3 - Sair cout << "\n\t\t% %"; %"; %"; %"; %";

cout << "\n\t\t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%"; cout << "\n\t\t% Centro Universitario do Norte Paulista - UNORP %"; cout << "\n\t\t% Engenharia da Computacao - Ano 2 / 2.Sem 2009 %"; cout << "\n\t\t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%";

cout << "\n\n\t\t Opcao: "; cin >> opcao;

switch(opcao) { case 1: cout << "\n\t\t Elemento: "; cin >> elem; push(pilha, elem); /* Chamada da funo void push(Pilha* p, float s) */ break;

case 2: pop(pilha); /* Chamada da funo float pop(Pilha* p) */

break;

case 3: sair = 's'; /* Representao de chamada do lao do-while para sair */ break;

default: cout << "\nOpcao invalida!"; } } while (sair != 's'); system("pause"); return(0); } |-----------------------------------------------------------------------------------------------------------------------| Cdigo em C ------ Pilha.c -----/* Centro Universitrio do Norte Paulista - UNORP Curso: Engenharia da Computao - 2 A - 2 Semestre 2009 Disciplina: Estrutura de Dados I Prof Esp. Enio Jos Bolognini Data: 15/08/2009 Modificado: 22/08/2009 */ #include <stdio.h> #include <stdlib.h> #define MAX 6 #define MIN 1 /*

Criao do #define MIN -1 de um espao mnimo, seria o elemento do comeo da Pilha */ typedef struct { int pos; float vetor[MAX]; }Pilha; Pilha* cria(void) { Pilha* p=(Pilha*)malloc(sizeof(Pilha)); p->pos=MIN; return(p); } void push(Pilha* p, float s) { if(p->pos==MAX) { printf("\n Capacidade da Pilha Estourou!"); exit(1); } p->vetor[p->pos]=s; p->pos++; } int stack_void(Pilha* p) { return(p->pos == MIN); } float pop(Pilha* p) { float s; if (stack_void(p)) { printf("\n Pilha Vazia!"); exit(1); } s = p->vetor[p->pos - 1]; p->pos--; return(s); } main(void) { Pilha* pilha; int elem, opcao; char sair = 'n'; pilha = cria(); do{ printf("\n\t\t |-----------------------------------------------------------------------------------------------------------------------------------|"); printf("\n\t\t | MENU DA PILHA |"); printf("\n\t\t |-----------------------------------------------------------------------------------------------------------------------------------|"); printf("\n\t\t | |"); printf("\n\t\t | 1 - Empilhar |"); printf("\n\t\t | 2 Desempilhar |");

printf("\n\t\t | 3 - Sair |"); printf("\n\t\t | |"); printf("\n\t\t |-----------------------------------------------------------------------------------------------------------------------------------|"); printf("\n\t\t | Centro Universitario do Norte Paulista - UNORP |"); printf(\n\t\t | Engenharia da Computacao - Ano 2 / 2.Sem 2009 |"); printf("\n\t\t |-----------------------------------------------------------------------------------------------------------------------------------|"); printf("\n\n\t\t Opcao: "); scanf(%d,&opo); switch(opcao) { case 1: printf("\n\t\t Elemento: "); cin >> elem; push(pilha, elem); break; case 2: pop(pilha); break; case 3: sair = 's'; break; default: printf("\nOpcao invalida!); } } while (sair != 's'); system("pause"); return(0); }

|---------------------------------------------------------------------------------------------------------------------------------| Programa em C/C++ ------ Pilha.cpp -----/* Centro Universitrio do Norte Paulista - UNORP Curso: Engenharia da Computao - 2 A - 2 Semestre 2009 Disciplina: Estrutura de Dados I Prof Esp. Enio Jos Bolognini Data: 15/08/2009 Modificado: 22/08/2009 */ #include <iostream.h> #include <stdio.h> #define MAX 6 #define MIN 1 /* Criao do #define MIN -1 de um espao mnimo, seria o elemento do comeo da Pilha

*/ typedef struct { int pos; float vetor[MAX]; }Pilha; Pilha* cria(void) { Pilha* p=(Pilha*)malloc(sizeof(Pilha)); p->pos=MIN; return(p); } void push(Pilha* p, float s) { if(p->pos==MAX) { cout << "\n Capacidade da Pilha Estourou!"; exit(1); } p->vetor[p->pos]=s; p->pos++; } int stack_void(Pilha* p) { return(p->pos == MIN); } float pop(Pilha* p) { float s; if (stack_void(p)) { cout << "\n Pilha Vazia!"; exit(1); } s = p->vetor[p->pos - 1]; p->pos--; return(s); } main(void) { Pilha* pilha; int elem, opcao; char sair = 'n'; pilha = cria(); do{ cout << "\n\t\t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"; cout << "\n\t\t% MENU DA PILHA %"; cout << "\n\t\t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"; cout << "\n\t\t% %"; cout << "\n\t\t% 1 - Empilhar %"; cout << "\n\t\t% 2 - Desempilhar %"; cout << "\n\t\t% 3 - Sair %"; cout << "\n\t\t% %"; cout << "\n\t\t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%";

cout << "\n\t\t% Centro Universitario do Norte Paulista - UNORP %"; cout << "\n\t\t% Engenharia da Computacao - Ano 2 / 2.Sem 2009 %"; cout << "\n\t\t%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"; cout << "\n\n\t\t Opcao: "; cin >> opcao; switch(opcao) { case 1: cout << "\n\t\t Elemento: "; cin >> elem; push(pilha, elem); break; case 2: pop(pilha); break; case 3: sair = 's'; break; default: cout << "\nOpcao invalida!"; } } while (sair != 's'); system("pause"); return(0); }

/* Esta apostila estar disponvel tambm no Xerox da Zez para estudos dos casos em pilha. */

Potrebbero piacerti anche