Definição de Pilha (Stack) São estruturas de dados do tipo LIFO (last-in first-out) - o
último elemento a ser inserido, será o primeiro a ser retirado.
A manipulação dos elementos é dada apenas por uma das extremidades da lista - topo
Para processar o penúltimo item inserido, deve-se remover o último.
Exemplos de pilhas são: pilha de pratos, pilha de livros, pilha de cartas de um baralho, etc.
Prof. Leticia Winkler 2
Observações sobre Pilha Na implementação de pilha,
em apenas uma das extremidades, chamada de topo, é realizada a manipulação dos elementos, em oposição a outra extremidade, chamada de base.
Todas as operações em uma pilha podem ser imaginadas como as que ocorre numa pilha de pratos em um restaurante ou como num jogo com as cartas de um baralho
Prof. Leticia Winkler 3
e1
e2
e3
e4
e5
empilhar desempilhar
Topo
Base
Operações com Pilha Criação da pilha
informar a capacidade no caso de pilha por contiguidade (usando vetor);
Inicialização da pilha determina o status inicial da pilha, a fim de prepará-la para a inserção
de dados.
Verificar se a pilha está cheia (no caso de pilha por contiguidade) Empilhamento
consiste em inserir um valor no topo da pilha. É preciso verificar previamente se a pilha está cheia.
Verificar se a pilha está vazia Desempilhamento
consiste em retirar um valor do topo da pilha. É preciso verificar previamente se a pilha está vazia.
Mostrar o topo
Prof. Leticia Winkler 4
Aplicações Usa-se pilha em aplicações em que os dados são
obtidos na ordem inversa àquela em que foram fornecidos.
Exemplos:
Calculadora para expressões matemáticas;
Conversão de número decimal para binário;
Retirada de mercadorias de um caminhão de entregas;
Mecanismo de fazer/desfazer do Word;
Mecanismo de navegação de páginas na Internet (avançar e retornar).
Prof. Leticia Winkler 5
Criar a Pilha Supondo uma pilha com capacidade para 5 valores
inteiros (5 nós). #define TAM 5 ou int const tam = 5;
int pilha[TAM]; // pilha propriamente dita ou int pilha[5];
int topo;
Prof. Leticia Winkler 6
0
1
2
3
4
Inicializar a Pilha Determina o status inicial da pilha, a fim de prepará-la
para a inserção de dados.
Na main:
topo = -1;
Prof. Leticia Winkler 7
0
1
2
3
4
Empilhar (Push) Consiste em inserir um valor no topo da pilha, desde que a
pilha não esteja cheia.
Atualiza a posição do topo.; e
Atribui o valor a ser inserido no novo topo
Parâmetros:
vetor de elementos;
topo da pilha; e
valor a ser empilhado (inserido)
Retorno: Não há
Empilhar o 10
Prof. Leticia Winkler 8
10 0
1
2
3
4
Empilhar: 10
topo 0
1
2
3
4
topo
Atualiza o topo
Empilhar Empilhar 25
Prof. Leticia Winkler 9
10
25
0
1
2
3
4
Insere o 25
topo
10 0
1
2
3
4
Atulaliza o topo
topo
Empilhar Empilhar 32
Empilhar 30
Prof. Leticia Winkler 10
10
25
32
0
1
2
3
4
Empilhar: 32
topo
10
25
32
30
0
1
2
3
4
Empilhar: 30
topo
Código da Função Empilhar void push(int p[], int valor, int &t, int capacidade) { if (capacidade-1 == t) // Testa se a Pilha está cheia cout << "ERRO: Pilha cheia."; else { t++; p[t] = valor; } }
Chamada :
push(pilha,valor,topo,tamanho);
Prof. Leticia Winkler 11
Desempilhar (Pop) Consiste em retirar um valor do topo da pilha e em
seguida, ajustar o topo.
Só é possível se a pilha não estiver vazia.
Parâmetros : vetor de elementos, topo da pilha e valor para armazenar o dado desempilhado.
Prof. Leticia Winkler 12
Desempilhar Na realidade a remoção de um elemento da pilha é
realizada apenas alterando-se a informação da posição do topo.
Prof. Leticia Winkler 13
10
25
32
30
0
1
2
3
4
Desempilhar
topo
Código da Função Desempilhar void pop(int p[], int &t) {
if (t == -1) { // Testa se a Pilha está vazia
cout << "ERRO : Pilha vazia." << endl;
return ; // Abandona a função
}
t--; // atualiza o topo
}
Chamada :
pop(pilha, topo);
Prof. Leticia Winkler 14
Outras Operações Verificar se a pilha está cheia – verifica a posição do
topo
bool isFull (int p[], int &t, int capacidade) {
return (t == capacidade - 1);
}
Verificar se a pilha está vazia – verifica a posição do topo
bool isEmpty (int p[], int &t) {
return (t == -1) ;
}
Prof. Leticia Winkler 15
http://www.cosc.canterbury.ac.nz/mukundan/dsal/StackAppl.html
Prof. Leticia Winkler 16
Questão #1 Prova: FCC - 2009 - TRT - 16ª REGIÃO (MA) - Técnico Judiciário - Tecnologia da Informação
Pilha é uma estrutura de dados a) cujo acesso aos seus elementos segue tanto a lógica LIFO quanto a FIFO.
b) cujo acesso aos seus elementos ocorre de forma aleatória.
c) que pode ser implementada somente por meio de vetores.
d) que pode ser implementada somente por meio de listas.
e) cujo acesso aos seus elementos segue a lógica LIFO, apenas.
Prof. Leticia Winkler 18
Questão #2 CENTRO FEDERAL DE EDUCAÇÃO TECNOLÓGICA DE CUIABÁ – MT.
As pilhas são estruturas de dados que possuem critérios para inclusão e remoção de nodos. Sendo assim, analise o trecho do código abaixo considerando os conceitos de pilhas e a linguagem de programação C.
1. #define fim 8 2. #define inicio 0 3. void pop (int p[10], int *fim, int val, int *status) 4. { 5. if (*fim == inicio – 1) { 6. *status = 0; 7. } 8. else { 9. val = p[*fim]; 10. (*fim) --; 11. *status = 1; 12. } 13. return val; 14. } Assinale a alternativa incorreta é: a) A função pop desempilha o vetor através do comando contido na linha 10. b) A variável status recebe o valor 0 quando a pilha estiver vazia. c) A função pop é uma implementação de remoção de nodos de uma estrutura LIFO. d) Um elemento contido na pilha só poderá ser retirado se estiver no topo. e) Se a variável “fim” valer 10, a função pop irá retornar ao valor contido no topo da pilha.
Prof. Leticia Winkler 19
Questão #3 ...
int stack[10];
int top = -1;
int item1 = 1;
int item2 = 0;
int item3 = 4;
push(stack, top, item2);
push(stack, top, item1);
push(stack, top, item1 + item3);
item2 = peek(stack, top);
push(stack, top, item3 * item3);
push(stack, top, item2);
push(stack, top, 3);
item2 = peek(stack, top);
pop(stack, top);
while (!isEmpty(stack)) {
item1 = pop(stack, top);
cout << item1;
}...
Observe o trecho de código ao lado: Stack é uma estrutura do tipo LIFO (última a entrar, primeira a sair) onde são aplicadas as operações usuais push( ) e pop( ). Existe ainda a operação peek( ) que retorna o elemento no topo da pilha sem removê-lo. A seqüência de valores impressa pelo programa é: (A) 5, 16, 1 (B) 4, 16, 4, 0, 1 (C) 5, 8, 5, 1, 0 (D) 5, 16, 5, 1, 0 (E) 4, 0, 4, 4, 1
Prof. Leticia Winkler 20
BNDS – Analista de Sistemas (Desenvolvimento) – 2005 -
Questão #4 ...
Stack pilha;
...
push(&pilha, 3);
push(&pilha, 4);
pop(&pilha);
push(&pilha, 5);
push(&pilha, 6);
pop(&pilha);
push(&pilha, 7);
push(&pilha, 8);
while (true) {
cout << pop(&pilha ) << ” “;
}...
A saída produzida pelo programa ao lado será:
A) 8 7 5 3;
B) 5 6 7 8;
C) 3 4 5 6 7 8;
D) 8 7 6 5 4 3;
E) 8 7 6 5.
Prof. Leticia Winkler 21
Eletronorte – Analista de Sistema – 2005
Questão #5 Quadro I – operações básicas operação significado Push(P,x) insere um elemento qualquer x na
pilha Pop(P) remove o elemento de topo da pilha Top(P) acessa, sem remover, o elemento de topo
da pilha P Quadro II – sequência de operações Push(POLICIAL_CIVIL, HARDWARE) Push(POLICIAL_CIVIL, SOFTWARE) POP(POLICIA_CIVIL) Push(POLICIAL_CIVIL, INTERNET) TOP(POLICIA_CIVIL) Push(POLICIA_CIVIL, SEGURANCA) POP(POLICIA_CIVIL) Push(POLICIA_CIVIL, TOP(POLICIA_CIVIL)) Push(POLICIAL_CIVIL, POP(POLICIAL_CIVIL)) Push(POLICIAL_CIVIL, REDES) POP(POLICIA_CIVIL) Push(POLICIA_CIVIL, TOP(POLICIA_CIVIL))
Considere a estrutura de dados PILHA, inicialmente vazia, suportando três operações básicas, conforme definidas no Quadro I e a sequência de operações descritas no Quadro II.
Após a execução da última operação Push(POLICIA_CIVIL,TOP(POLICIA_CIVIL)), o elemento de topo da pilha será igual a: (A) REDES. (B) INTERNET. (C) SOFTWARE. (D) SEGURANCA. (E) CRIPTOGRAFIA.
Prof. Leticia Winkler 22
Perito Criminal da Polícia Civil do Estado do Rio de Janeiro – Engenharia da Computação e Informática – 2008
Questão #6 VUNESP - 2009 - CETESB - Analista de TI - Sistemas
A estrutura de dados do tipo pilha (stack) é um tipo abstrato de dado baseada no princípio
a) da indiferença.
b) da localidade de referência.
c) de dividir para conquistar.
d) First In First Out (FIFO).
e) Last In First Out (LIFO).
Prof. Leticia Winkler 23
Questão #7 UFF - 2009 - UFF - Técnico de Laboratório – Informática
Na estrutura de dados tipo pilha, há duas operações básicas para empilhamento e desempilhamento. Essas operações são conhecidas como:
a) PUSH e PULL;
b) PULL e POP;
c) HEAP e POP;
d) Base e Topo;
e) PUSH e POP.
Prof. Leticia Winkler 24
Questão #8 CESGRANRIO - 2009 - BNDES - Profissional Básico - Análise de Sistemas - Desenvolvimento
Seja S uma pilha inicialmente vazia. Primeiramente, o elemento A é inserido em S. Em seguida, o elemento B, e assim por diante, até a inclusão final do elemento E. Ao término dessas operações, qual elemento estará no topo de S?
a) A.
b) B.
c) C.
d) D.
e) E
Prof. Leticia Winkler 25
Questão #9 ESAF - 2010 - MPOG - Analista de Planejamento e Orçamento - Tecnologia da Informação
No contexto de estrutura de dados, uma pilha é
a) uma lista do tipo LILO.
b) uma lista do tipo FIFO.
c) um tipo de lista linear em que as operações de inserção e remoção são realizadas na extremidade denominada topo.
d) um tipo de lista linear em que as operações de inserção e remoção são realizadas aleatoriamente.
e) um tipo de lista linear em que as operações de inserção são realizadas em uma extremidade e as operações de remoção são realizadas em outra extremidade.
Prof. Leticia Winkler 26
Questão #10 A tabela abaixo mostra as operações para a manipulação de uma pilha.
Utilizando as definições, a seqüência de instruções ao lado foi implementada para avaliar o resultado de uma expressão, sendo A, B, C, D e E os operandos desta expressão. O resultado da avaliação é acumulado em F.
PUSH A
PUSH B
SUB
PUSH C
PUSH D
PUSH E
MPY
ADD
DEC
DIV
POP F
Com base no que foi exposto acima, se A, B, C, D e E apresentarem, respectivamente, os valores 9, 3, 2, 1 e 1, qual o valor armazenado em F após a execução da instrução POP F?.
a) 2 b) 3 c) 4 d) 5 e) 6
Prof. Leticia Winkler 27
CESGRANRIO - 2006 - EPE - Técnico de Nível Superior - Área Tecnologia da Informação
Exercícios 1) Faça um programa em C++ para ler um número inteiro maior que zero, converter este número de decimal para binário, usando pilha e apresentar na tela, o resultado da conversão.
2) Construa um programa em C++ para ler um vetor de caracteres, empilhar os caracteres que são letras em uma pilha P1 e empilhar os que são dígitos em outra pilha P2. Ao final, desempilhe os dados de P2 e em seguida, os de P1, imprimindo-os na tela.
DICA : Use as funções isdigit e isalpha declaradas em cctype.
Prof. Leticia Winkler 30