A PILHA
ED aula 6
Conceito
O conceito de pilha é um dos mais importantes na ciência da computação.
E um conceito muito simples
Desenvolve um papel muito importante nas áreas de programação e linguagens de programação.
É uma ferramenta valiosa na solução de diversos problemas
Definição
Conjunto ordenado de itens.
Novos elementos podem ser inseridos
Podem ser eliminados termos (itens) de uma extremidade (topo da pilha)
A B C D E F
Uma pilha contendo termos de pilha
Definição ...
Ao contrário de vetores compreende Inserção e eliminação de itens sendo um objeto dinâmico ou constantemente mutável
Como uma pilha muda???? Isso define o conceito de pilha
Definição ...
Na pilha uma única extremidade da pilha é designada como topo da pilha.
Novos itens são colocados no topo da pilha (o topo deve ser deslocado) ou os itens que estiverem no topo da pilha poderão ser removidos (o topo deverá ser deslocado para baixo)
Qual é o lado de cima????
Definição ...
Tem que ser determinado o extremo da pilha que será determinada como topo.
A B C D E F
Neste caso o desenho esta feito como se F estivesse fisicamente em cima da página em relação aos outros itens da pila. Então quando novos itens sejam adicionados serão colocados acima de F e se foram eliminados F será o primeiro em ser eliminado.
Filme de uma pilha
A B C D E F
A B C D E F
A B C D E F
A B C D E F
A B C D E
A B C D
A B C D E F
G H
I
H
F
E
•A pilha se expande e reduz com o passar do tempo
•Em cada a eliminação será feita a partir do topo e os elementos inseridos serão nesse instante o topo da pilha.
•Atributo mais importante da pilha, o ultimo elemento inserido numa pilha é o primeiro em ser eliminado
•A pilha as vezes é chamada lista last-in, first-out (LIFO) ou UEPS
Visão da pilha
No tem como se distinguir entre 2 estados iguais da pilha em diferentes momentos. A pilha pode conter os mesmos itens na mesma ordem, com o mesmo elemento no topo. Se quiser essa informação deve ser mantido num outro lugar, a pilha não é vista dessa forma fílmica.
A pilha não é observada de perfil e sim com uma visão de cima para baixo e em caso de elementos diferentes com iguais elementos no topo só poderá ser determinada a igualdade ou não é removendo todos elementos das duas pilhas e comparando-os individualmente
Operações primitivas da Pilha
Empilhado: Quando um elemento é incluído sobre pilha. Operação push(s, i). Incluirá o elemento i na pilha s
Desempilhado: Quando um item é removido de sobre a pilha. Operação pop(s).
Removerá o elemento superior da pilha s e o retornará como valor da função.Ex. i = pop(s)
Ver exemplo na figura anterior
Operações primitivas da Pilha
Não existe um limite máximo para o número de itens que podem ser mantidos numa pilha por definição.
Empilhar outro elemento na pilha simplesmente produz um conjunto maior de itens.
Se a pilha contem só um elemento e este for desempilhado, a pilha não conterá itens e será chamada de pilha vazia.
Operações primitivas da Pilha
push pode ser aplicado a qualquer pilha
pop não pode ser aplicada a uma pilha vazia
empty(s) definirá se a pilha está vazia o não devolvendo TRUE ou FALSE
Para a determinação do item superior da pilha sem removê-lo usaremos stacktop(s)
Operações primitivas da Pilha
A operação stacktop não é uma nova operação, ela pode ser descomposta de dois operações básicas. Quais??
Como a operação pop, stacktop, não está definida quando a pilha está empty. O resultado de uma tentativa de desempilhar ou acessar um item de uma pilha vazia é chamado de underflow Como evitar o underflow??
Exemplo de uso de uma pilha
)) 5 . 2 4
/(
) ))
3 /(
) ((
* ((
7 − X X + Y J − + Y −
Para que a expressão este correta tem que se verificar que:
1. Existe um número igual de parênteses esquerdos e direitos. ((A+B) ou A+B(
2. Todo parêntese da direita esta precedido por um parêntese da esquerda correspondente )A+B (-C ou (A+B))-(C+D
Neste problema cada parêntese de esquerda a direita é um escopo e o cada parêntese da direita como um fechamento de escopo
A profundidade de agrupamento num ponto é a quantidade de parêntesis abertos e ainda não fechados nesse ponto, que correspondera ao número de parêntesis da direita que ainda não foram encontrados
Exemplo de uso de uma pilha
Definimos a contagem de parênteses
CP = #parent_esquerdos - #parent_direitos
encontrados ao rastrear a expressão a partir da extremidade esquerda ate o ponto em questão Se CP > 0 então é a profundidade de grupamento
Para cumprir a validez da expressão então devemos ter:
CP = 0 ao final da expressão (Nenhum escopo foi aberto sem ter encontrado outro para fechar)
CP em cada ponto é não negativa. Isso implica que não foi encontrado p. direita para o qual não exista p. esquerdo
Exemplo de uso de uma pilha
Se alteramos o problema suponhamos a existência de três tipos diferentes de
limitadores de escopo (), [] e {}. Nesse caso um finalizador de escopo deve ser o mesmo de seu iniciador Ex.. (A+B] [(A+B]) ou {A-(B]}
são inválidas
0 1 2 11222 2
2 432 433444
4 344 2
2 12 0
0
)) 5 . 2 4
/(
) ))
3 /(
) ((
* ((
7 − X X + Y J − + Y −
Exemplo de uso de uma pilha
Então não só devemos contar os escopos abertos como também os tipos. Estas informações são importantes porque agora quando encontramos um finalizador de escopo precisamos conhecer o símbolo com o que o escopo foi aberto para assegurar que ele seja corretamente fechado
Exemplo de uso de uma pilha
Inicia pilha e enquanto não fim de string e valida
Sempre que um iniciador de escopo for encontrado ele será empilhado.
Sempre que um finalizador de escopo for encontrado a pilha será examinada.
Se estiver vazia invalida!!!
Se não estiver vazia, Desempilhamos
Se o item corresponde ao finalizador de escopo continuamos
Se não corresponde invalida!!!!
Exercício
Fazer o pseudocódigo do algoritmo
Por que neste problema usamos pilha??
A pilha como um TDA
abstract typedef <<thetype>> STACK (thetype);
abstract empty(s) STACK (thetype)s;
postcondition empty == (len(s) == 0);
abstract thetype pop(s) STACK (thetype)s;
precondition empty(s) == FALSE;
postcondition pop == first(s’);
s == sub(s’, 1, len(s’)- 1 );
abstract push(s, t) STACK (thetype)s;
thetype t;
postcondition s == <t> + s’;
Exercícios
Use push, pop e empty para construir operações que façam a. Definir i com o segundo elemento a partir do topo da pilha, deixando a pilha sem seus dois elementos superiores.
b.O anterior deixando a pilha inalterada
c. Dado um inteiro n, definir i como o enésimo elemento a partir do topo da pilha deixando a pilha sem seus n elementos superiores
d. O anterior deixando a pilha inalterada
e. Definir i como o ultimo elemento da pilha deixando a pilha vazia
f. O anterior deixando a pilha inalterada.
g. Definir i como o terceiro elemento a partir do final da pilha
Exercício
Escreva um algoritmo para determinar se um string de caracteres é complemento de outro
Se x = “ABABBA” y = “ABBABA” então x C y. Em cada ponto só poderá ler um caractere da string.