Programação II
Prof. Mateus Raeder
Universidade do Vale do Rio dos Sinos
- São Leopoldo -
Listas especiais
• O armazenamento sequencial (estático) é útil
quando as estruturas sofrem poucas remoções ou
inserções, ou quando estas não acarretam grandes
movimentações de nós
– Não é exatamente o caso de listas que permitem inserção
em qualquer posição
– O armazenamento sequencial é mais utilizado para
implementas tipos especiais de listas:
• Filas (Queue em inglês)
• Pilhas (Stack em inglês)
• Deques (Deque em inglês)
Programação II – Prof. Mateus Raeder
Pilha
(Stack)
Programação II – Prof. Mateus Raeder
Pilhas
• Os elementos são inseridos e removidos sempre na
extremidade final, chamada de topo da pilha
• Contém um ponteiro (variável) que marca o topo
da pilha
• Implementa a norma LIFO (Last-In, First-Out)
– Último a entrar, primeiro a sair
• Pilha vazia: topo = -1
Programação II – Prof. Mateus Raeder
Pilhas
• Suponhamos uma pilha de números
inteiros P que, em certo momento,
possui os seguintes 7 elementos:
1 6 9 -3 0 3 5
• Declarando um array de inteiros de
nome P com MAX=10 elementos
(P[0..MAX-1]), teremos a seguinte
pilha:
5
3
0
-3
9
6
1
Programação II – Prof. Mateus Raeder
Operações sobre pilhas
- inserir número 2
- inserir número 8
- inserir número 4
- remover elemento
14
8
2
top
top
top
- inserir número 1
- remover elemento
- remover elemento
Programação II – Prof. Mateus Raeder
Exercício: Pilhas
• Dada a pilha ao lado, realize as
operações abaixo
(cumulativamente) e desenhe a
pilha resultante em cada passo:
–
–
–
–
–
–
Inserir 7
Retirar o primeiro elemento
Inserir -4
Inserir 6
Retirar o primeiro elemento
Retirar o primeiro elemento
3
Programação II – Prof. Mateus Raeder
Operações sobre pilhas
• public boolean isEmpty( )
– verifica se a pilha está vazia
• public boolean isFull( )
– verifica se a pilha está cheia
• public boolean push( int element )
– insere o nó no topo da pilha
Programação II – Prof. Mateus Raeder
Operações sobre pilhas
• public int pop( )
– retorna e remove o nó do topo da pilha
• public int getTop ( )
– retorna o nó do topo da pilha, sem removê-lo
• public void print( )
– exibe todos os nós da pilha
Programação II – Prof. Mateus Raeder
Estouros em pilhas
• Estouro negativo:
– Underflow (pilha vazia sofre operação de remoção)
• Estouro positivo:
– Overflow (pilha completamente preenchida sofre
operação de inserção)
Programação II – Prof. Mateus Raeder
Pilhas
• Supondo a existência da classe Stack, desenhe a
pilha criada através do código abaixo (a saída do
programa):
public static void main(String args[]){
Stack p = new Stack(5);
p.push(4);
p.push(7);
p.push(14);
p.pop();
p.push(3);
p.pop();
p.pop();
p.print();
}
Programação II – Prof. Mateus Raeder
Pilha
public class Stack {
private int s[];
private int top = -1;
public Stack (int size){
s = new int[size];
}
... //demais métodos
}
Programação II – Prof. Mateus Raeder
Pilha
• Verificar se está vazia ou se está cheia
– Vazia:
/* Retorna:
- true se a lista está vazia
- false caso contrário */
public boolean isEmpty(){
if(top == -1)
return true;
return false;
}
Programação II – Prof. Mateus Raeder
Pilha
• Verificar se está vazia ou se está cheia
– Cheia:
/* Retorna:
- true se a lista está vazia
- false caso contrário */
public boolean isFull(){
if(top == s.length - 1)
return true;
return false;
}
Programação II – Prof. Mateus Raeder
Pilha
• Inserir e remover elementos
– Inserir (push)
public void push(int element) throws OverflowException{
if(isFull())
throw new OverflowException();
else{
top++;
s[top] = element;
}
}
Programação II – Prof. Mateus Raeder
Pilha
• Inserir e remover elementos
– Remover (pop)
public int pop() throws UnderflowException{
if(isEmpty())
throw new UnderflowException();
else{
int element = s[top];
top--;
return element;
}
}
Programação II – Prof. Mateus Raeder
Pilha
• Retornar o elemento do topo, sem remover
public int getTop() throws UnderflowException{
if(isEmpty())
throw new UnderflowException();
else
return s[top];
}
Programação II – Prof. Mateus Raeder
Pilha
• Imprimir os elementos da pilha
public void print(){
for(int i=top; i>=0; i--)
System.out.println(s[i]);
}
Programação II – Prof. Mateus Raeder
Pilha
public static void main(String args[]) {
Stack s = new Stack(6);
try {
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);
s.push(6);
} catch (OverflowException e) {
System.out.println(e.toString());
}
try{
int removed = s.pop();
removed = s.pop();
s.print();
} catch (UnderflowException e) {
System.out.println(e.toString());
}
}
Programação II – Prof. Mateus Raeder
Download

Prof. Mateus Raeder