Aula 5 e 6 Pilhas e suas Aplicações prof Leticia Winkler 1
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 Topo Base empilhar e 5 e 4 e 3 e 2 e 1 desempilhar Prof. Leticia Winkler 3
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; 4 3 2 1 0 Prof. Leticia Winkler 6
Inicializar a Pilha Determina o status inicial da pilha, a fim de prepará-la para a inserção de dados. Na main: topo = -1; 4 3 2 1 0 Prof. Leticia Winkler 7
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 Atualiza o topo 4 3 2 1 0 topo Empilhar: 10 4 3 2 1 0 10 topo Prof. Leticia Winkler 8
Empilhar Empilhar 25 Atulaliza o topo 4 3 2 Insere o 25 4 3 2 1 topo 1 25 topo 0 10 0 10 Prof. Leticia Winkler 9
Empilhar Empilhar 32 Empilhar 30 Empilhar: 32 4 Empilhar: 30 4 3 3 30 topo 2 32 topo 2 32 1 25 1 25 0 10 0 10 Prof. Leticia Winkler 10
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. Desempilhar 4 3 2 1 0 30 32 25 10 topo Prof. Leticia Winkler 13
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ões de Concurso Prof. Leticia Winkler 17
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 BNDS Analista de Sistemas (Desenvolvimento) 2005 - 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... 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; Prof. }... Leticia Winkler 20
Questão #4 Eletronorte Analista de Sistema 2005... 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
Questão #5 Perito Criminal da Polícia Civil do Estado do Rio de Janeiro Engenharia da Computação e Informática 2008 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
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 CESGRANRIO - 2006 - EPE - Técnico de Nível Superior - Área Tecnologia da Informação 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
Prof. Leticia Winkler 28
Respostas: Q1) Q2) Q3) Q4) Q5) Q6) Q7) Q8) Q9) Q10) E E D A B E E E C B Prof. Leticia Winkler 29
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