Professional Documents
Culture Documents
Pilhas e Filas
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
#1
Contedo
1. Pilhas (a) Implementao baseada em listas (b) Implementao baseada em vectores 2. Filas (a) Implementao baseada em listas (b) Implementao baseada em vectores 3. Aplicaes de pilhas (a) Clculo de expresses RPN (b) Converso de expresses inxas para RPN 4. Aplicao de las (a) Percurso mais curto num labirinto
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
#2
Pilhas
Pilha Estrutura de dados em que a insero e a remoo de elementos de uma sequncia se faz pela mesma extremidade, geralmente designada por topo da pilha. Uma pilha pode ser considerada como uma restrio de lista. Visto que se trata de uma estrutura de dados mais simples que a lista, possvel obter implementaes mais ecazes. O conceito de iterador no se aplica a esta estrutura de dados. LIFO = Last-in First-out
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
#3
5 4 3 2 1 4 3 2 1 3 2 1 2 1 1 5 4 3 2 1
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
#4
FEUP/LEEC,AED,2001/2002, v0.1
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
#6
push() e top()
template <class T> void LStack<T>::push(const T &x) { topOfStack = new ListNode(x, topOfStack); } template <class T> const T & LStack<T>::top() const { if (isEmpty()) throw Underflow(); return topOfStack->element; }
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
#7
pop() e topAndPop()
template <class T> void LStack<T>::pop() { if (isEmpty()) throw Underflow(); ListNode *oldTop = topOfStack; topOfStack = topOfStack->next; delete oldTop; } template <class T> T LStack<T>::topAndPop() { T topItem = top(); pop(); return topItem; }
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
#8
template <class T> class VStack { public: explicit VStack(int capacity = 100); bool isEmpty() const; bool isFull() const; const T & top() const; void makeEmpty(); void pop(); void push(const T &x); T topAndPop(); //...
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
#9
topOfStack = -1
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 10
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 11
FEUP/LEEC,AED,2001/2002, v0.1
Filas
Fila Estrutura de dados em que a insero e a remoo de elementos de uma sequncia se faz por extremidades opostas, geralmente designadas por cabea e cauda da la. Uma la pode ser considerada como uma restrio de lista. Visto que se trata de uma estrutura de dados mais simples que a lista, possvel obter implementaes mais ecazes. O conceito de iterador no se aplica a esta estrutura de dados. FIFO = First-in First-out
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 13
Funcionamento de las
12345 1 1 2 3 4 5
5 1 2 3 4 5
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 14
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 15
FEUP/LEEC,AED,2001/2002, v0.1
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 17
FEUP/LEEC,AED,2001/2002, v0.1
front
front
front
front
back
back
front
back
front
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 19
O campo currentSize no estritamente necessrio, mas facilita bastante a gesto da estrutura. Nota: No se permite a extenso do vector.
Pilhas e Filas # 20
FEUP/LEEC,AED,2001/2002, v0.1
10
FEUP/LEEC,AED,2001/2002, v0.1
Notao RPN
Notao RPN: Expresses aritmticas em que os operadores surgem a seguir aos operandos (notao ps-xa). RPN=Reverse Polish Notation Notao inxa: Os operadores binrios surgem entre os operandos. Notao inxa: 2 * ( 4 + 5 ) / 3 Notao RPN: 2 4 5 + * 3 / Vantagens de RPN: No requer parnteses nem regras de precedncia.
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 22
11
5 4 2 2 4 2 9 2 18 3 18 6
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 23
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 24
12
1. Ler expresses de cin; 2. Os elementos da expresso so separados por espaos e terminadas com =; 3. Escrever os resultados em cout; 4. Ignorar linhas vazias; 5. Terminar com m-de-cheiro (^D em Unix, ^Z em Windows)
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 25
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 26
13
2*(4+5)/3; 2*(4+5)/3; 2*(4+5)/3; 2*(4+5)/3; 2*(4+5)/3; 2*(4+5)/3; 2*(4+5 ) / 3; 2*(4+5) / 3; 2*(4+5) / 3 ; 2*(4+5)/3 ;
+ ( * Sada: 2 4 5 * ( * ( *
+ ( * * + / * 3 / / =
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
Pilhas e Filas
14
RPN
# 27
# 28
3 2 1 2
2 1 a 1 2 1 2 3 4 5 6 6 7 2 b 8 7 8 9 8 9
3 2 1 2
2 1 a 1 2 1 2 3 4 5 6 6 7 2 b 8 7 8 9 8 9
3 4 5 6 7
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 29
Algoritmo de Lee
1. Numerar todos os vizinhos do ponto inicial com 1. 2. Colocar os vizinhos numa la. 3. Enquanto a la no estiver vazia e no se tiver atingido o ponto de destino: (a) Retirar um ponto da la; (b) Numerar os seus vizinhos livres com o nmero do ponto acrescido de 1; (c) Colocar os novos pontos (vizinhos) na la 4. Se a la estiver vazia e no se tiver atingido o ponto de destino, no existe percurso. Caso contrrio, escrever o percurso em cout.
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 30
15
Especicao do labirinto
1 2 3 4 5 6 7 8 9 10 11 12
12 12 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 (1,1)
1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 (10,2)
0 0 0 0 0 1 0 1 1 1 0 0
0 0 1 1 0 0 0 0 1 1 0 0
0 0 1 1 1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 1 0 0 1 1
1 1 0 0 0 0 0 1 1 0 1 0
1 2 3 4 5 6 7 8 9 10 11 12
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 31
Especicao do programa
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 32
16
FEUP/LEEC,AED,2001/2002, v0.1
Pilhas e Filas
# 33
FEUP/LEEC,AED,2001/2002, v0.1
17
Determinao do percurso
Ponto *percurso = new Ponto [comprimento_percurso]; // refazer o percurso do ponto final para o inicial corrente = fim; for (int j = comprimento_percurso -1; j >= 0; j--) { percurso[j] = corrente; // encontrar predecessor for (int i = 0; i < n_viz; i++) { vizinho.coluna = corrente.coluna + delta_coluna[i]; vizinho.linha = corrente.linha + delta_linha[i]; if (grelha[vizinho.linha][vizinho.coluna] == j + 2) break; } corrente = vizinho; } Pilhas e Filas # 35
FEUP/LEEC,AED,2001/2002, v0.1
18