Estruturas de Informação I - Aula 6

Transcrição

Estruturas de Informação I - Aula 6
Estruturas de Informação I - Aula 6
Pilhas
João Araujo Ribeiro
[email protected]
Universidade do Estado do Rio de Janeiro
Departamento de Engenharia de Sistemas e Computação
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
1 / 16
Resumo
1
EI05 - Pilhas
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
2 / 16
EI05 - Pilhas
Pilhas
Uma
Pilha é uma coleção de objetos que são inseridos e retirados de
acordo com o princípio Last in, First out . Um usuário pode isnerir objetos
numa pilha a a qualquer momento, porém só tem acesso ou pode remover
o objeto inserido mais recente no topo da pilha.
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
3 / 16
EI05 - Pilhas
Push e Pop
As operações fundamentais são Push e Pop nos objetos na pilha.
Quando precisamos retirar da pilha, fazemos um pop na pilha, que
recupera o elemento do topo da pilha. Quando acrescentamos um objeto à
pilha, fazemos um push e este objeto se torna o novo topo.
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
4 / 16
EI05 - Pilhas
Exemplo 1 de pilha
Navegadores de Internet armazenam os endereços dos sites recentemente
visitados num pilha. Cada vez que o usuário visita um novo site, este site é
colocado (push ) no topo da pilha. O navegador permite então que o
usuário faça um pop de retorno para sites visitados anteriormente, com o
botão back .
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
5 / 16
EI05 - Pilhas
Exemplo 2 - Undo
Editores de texto normalmente oferecem o recurso de undo, desfazer,que
cancela edições recentes do texto, revertendo o documento para um estado
anterior às modicações. Esta operação de desfazer pode ser realizada
mantendo as mudanças efetuadas no texto numa pilha.
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
6 / 16
EI05 - Pilhas
TAD Pilha
Pilhas são a estrutura de dados mais simples, porém uma das mais
importantes. Elas são usadas em muitas applicações e são ferramentas
usadas por estruturas e algoritmos mais sosticados. Formalmente, uma
Pilha é um tipo abstrato de dados (TAD) que suporta os dois métodos
seguintes.
S.push(e) : Coloca o elemento e no topo da pilha
S.
S.pop( ) : Remove e retorna o elemento do topo da pilha
S; um erro
ocorrerá se a pilha estiver vazia.
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
7 / 16
EI05 - Pilhas
Implementação da Pilha como Array 1/2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# coding=UTF-8
class Empty(Exception):
"""Erro na tentativa de ter acesso a um elemento vazio."""
pass
class ArrayStack :
"""Implementação usando list para armazenar a pilha"""
def __init__(self) :
"""Cria pilha vazia"""
self._data = []
def __len__ (self):
"""Retorna o número de elementos na pilha."""
return len(self._data)
def push(self, item) :
self._data.append(item)
def isEmpty(self) :
"""Retorna true se a pilha está vazia."""
return (self._data == [])
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
8 / 16
EI05 - Pilhas
Implementação da Pilha como Array 2/2
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def top(self):
"""Retorna (mas não remove elemento no topo da pilha"""
if self.isEmpty( ):
raise Empty( Pilha vazia )
return self._data[-1]
def pop(self):
"""Remove e retorna o elemento do topo da pilha"""
if self.isEmpty( ):
raise Empty( Pilha vazia )
return self._data.pop( )
S = ArrayStack()
S.push(10)
S.push(20)
print S.pop()
print S.pop()
print S.pop() #causa exceção
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
9 / 16
EI05 - Pilhas
Análise da Implementação
Push e pop podem ocasionar alocação de memória
Com isso, seus tempos não são O(1) sempre.
Podemos acrescentar código para limitar o tamanho da pilha na
inicialização.
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
10 / 16
EI05 - Pilhas
Invertendo dados usando pilha
Como consequência de sua construção, podemos usar uma pilha para
inverter a ordem de elementos de uma sequência de dados.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# coding=UTF-8
from classepilha import *
import sys
def reverse_file(filename):
"""Substitui arquivo com seu conteúdo invertido linha a linha."""
S = ArrayStack()
original = open(filename)
for line in original:
S.push(line.rstrip(\n))
original.close( )
# Agora vamos substituir com o conteúdo em ordem LIFO
# reabrindo arquivo original
output = open(filename,w)
while not S.isEmpty( ):
output.write(S.pop( ) +\n) # reinsere novas linhas
output.close( )
reverse_file(teste.txt)
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
11 / 16
EI05 - Pilhas
Testando Delimitadores
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# coding=UTF-8
from classepilha import *
def is_matched(expr):
"""Retorna True se todos delimitadores casam; False caso contrário."""
lefty = ({[ # abrindo delimitadores
righty = )}] # fechamentos respectivos
S = ArrayStack()
for c in expr:
if c in lefty:
S.push(c) #push delimitador na pilha
elif c in righty:
if S.isEmpty( ):
return False #erro
if righty.index(c) != lefty.index(S.pop()):
return False #erro
return S.isEmpty()
if is_matched([(5+x)-(y+z)]):
print "ok"
else:
print "Erro"
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
12 / 16
EI05 - Pilhas
Testando tags Html 1/2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# coding=UTF-8
from classepilha import *
def is_matched_html(raw):
"""Retorna True se toda tag HTML tem seu fechamento correto; False caso contrári
S = ArrayStack()
j = raw.find(<) # procura primeiro <
while j != -1:
k = raw.find(>, j+1) # encontra próximo >
if k == -1:
return False # tag inválida
tag = raw[j+1:k] # retira < >
# this is opening tag
if not tag.startswith(/): #isto é uma tag de abertura
S.push(tag)
else: # tag de fechamento
if S.isEmpty():
return False # não casou
if tag[1:] != S.pop():
return False # Erro de delimitador
j = raw.find(<, k+1) # encontra próximo <
return S.isEmpty() # todas as tags casadas?
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
13 / 16
EI05 - Pilhas
Testando tags Html 2/2
23
24
25
26
27
28
f = open("teste.html", "r")
if is_matched_html(f.read()):
print Ok
else:
print Problemas de delimitadores
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
14 / 16
EI05 - Pilhas
Exercício 1
1 - Modique a implementação de ArrayStack para que a capacidade da
pilha seja limitada a
maxlen elementos, onde maxlen é um parâmetro
opcional para o construtor. Se um push é chamado quando a pilha está
cheia, lance uma exceção de Pilha cheia (denida de modo similar a Empty)
2 - Implemente uma função que inverta uma lista de elementos
colocando-os numa pilha em uma ordem e depois os escrevendo de volta à
lista na ordem inversa.
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
15 / 16
EI05 - Pilhas
FIM
João Araujo Ribeiro (UERJ)
Estruturas de Informação I
EstrInf
16 / 16

Documentos relacionados