Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
"[" + list[0];
= 1; i <= top; i++)
" + list[i];
"]";
}
} // Stack
10/35
Estruturas de Dados I
Copywrite 2011-2013 by LCDG
/**
* Criao de uma pilha, inicialmente vazia, capaz de armazenar floats.
* Pode ser especificada uma capacidade inicial n ou no, e o espao
* automaticamente redimensionado automaticamente, por cada push e pop.
* O default (MINCAPACITY) uma capacidade para 4 floats.
* Construtores:
*
public Stack(int n);
*
Prcondio: n >= 0. Para n < MINCAPACITY, n = MINCAPACITY.
*
public Stack();
*
Prcondio: nenhuma.
*/
public abstract class AbstractStack1 {
...
public abstract void push(float item);
...
public abstract float pop();
...
public abstract float peek();
...
public abstract boolean isEmpty();
...
public abstract String toString();
}
public Stack(int n)
{
if (n < 0)
throw new IllegalArgumentException("Tamanho invlido: " + n);
if (n < MINCAPACITY) n = MINCAPACITY;
list = new float[n];
// Cria o array com n posies
top = -1;
// -1 indica pilha vazia
OCAPACITY = n;
// Salva o valor original de list.length
}
public Stack() {
this(MINCAPACITY);
}
...
Duas observaes. Primeira: MINCAPACITY um atributo privado (o usurio no pode zoar com ele),
esttico (ou seja, uma caracterstica do tipo e no da instncia) e final (uma vez associado um valor a ele,
no poder mais ser alterado em ponto algum do cdigo). uma constante de tipo e vale para todas as
instncias criadas (sem exceo). Segunda: caso o usurio fornea uma capacidade menor que
MINCAPACITY, o tipo ( revelia) cria uma pilha com capacidade inicial MINCAPACITY. No seremos chatos
com o usurio e abortar o cdigo s porque ele no leu direito o manual (que ainda no est feito) e iniciaremos
com a capacidade default.
Eram duas observaes? No. So 3. OCAPACITY um atributo privado (o usurio no pode zoar com ele),
NO esttico (ou seja, uma caracterstica da instncia e no do tipo) e final (uma vez associado um valor a
ele, no poder mais ser alterado em ponto algum do cdigo). uma constante de instncia e vale apenas
para a particular instncia. (Foi um copy & paste do pargrafo anterior? )
De modo assim at random, vamos agora escrever umas operaes auxiliares que sero teis
11/35
Estruturas de Dados I
Copywrite 2011-2013 by LCDG
...
// Mtodo auxiliar para modificar o tamanho do array list
private void resize(int newSize) {
// n tem a menor capacidade e no trunca a pilha ?
assert newSize >= OCAPACITY && newSize > top;
// Copia os antigos valores para a nova pilha
float[] newList = new float[newSize];
for (int ndx = 0; ndx <= top; ndx++)
newList[ndx] = list[ndx];
list = newList;
}
/** Est vazia? */
public boolean isEmpty() { return top == -1; }
/** Est cheia? */
private boolean isFull() { return top == list.length - 1; }
...
resize() muda o tamanho do array fazendo a cpia do que antes estava l (at top, inclusive). A assero
colocada indica que sempre que resize(n) chamado, n consistido caso o compilador tenha as
verificaes de asseres habilitadas (o default que no se verifiquem). Alm de documentar o cdigo, a
assero algo til em cdigos maiores numa fase de depurao. isFull() agora passa a ser um mtodo
privado, j que o usurio no mais necessita fazer esse teste (mas continua sendo feito no corpo de Stack).
Terreno preparado agora, pode-se finalmente escrever push() e pop()
...
/**
* Adiciona item na pilha.<br>
* @param value o valor que colocado na pilha
* @exception OverflowException no caso da pilha estar cheia
*/
public void push(float item) {
if (isFull())
resize(2 * list.length);
list[++top] = item;
// Coloca no final da lista
}
/**
* Remove do topo da pilha e retorna valor.<br>
* @return o valor do topo da pilha.
* @exception UnderflowException no caso da pilha estar vazia
*/
public float pop() {
if (isEmpty())
// ... se vazia gera exceo
throw new UnderflowException("Sem pops numa pilha vazia.");
/* No caso da lista ficar ocupada e o tamanho ainda ser
maior que OCAPACITY, divide o tamanho por 2*/
if (top < list.length / 4 && list.length > OCAPACITY)
resize(list.length / 2);
return list[top--];
// Retorna o topo e decr. top
}
...
Conforme prometido, isFull() agora apenas utilizada por propsitos de legibilidade do cdigo. De
acordo com o fato da pilha estar cheia, push() incumbe-se de aumentar o tamanho do array antigo,
mantendo os valores l anteriormente (note que a pilha mantm-se inalterada e top no deve ser alterado
por resize(), como no ). No caso de pop(), caso o array esteja meio vazio (digo, com menos de
da capacidade preenchida), diminui-se o espao que ele ocupa.
Os mtodos restantes, peek() e toString() permanecem inalterados da implementao 1.
Note que agora push() e pop() no so mais O(1)! Como as operaes de redimensionamento do array no
so frequentes diz-se que push() e pop() tem complexidade O(1) amortizada. Ou seja, O(1) na maior parte
do tempo e as eventuais operaes O(n) so diludas em mdia pela maior ocorrncia de operaes O(1).
Nessa verso que ajusta o tamanho dos arrays, note tambm que existe um preo a pagar pela
12/35
Estruturas de Dados I
Copywrite 2011-2013 by LCDG
flexibilidade: a do overhead pequeno (mas que existe) a cada push() e pop(), devido aos testes adicionais
efetuados.
compilador)
1. (a.2013) Exemplifique algumas aplicaes que possam ser feitas com pilhas alm das discutidas em
sala de aula.
4. (UW's CSE142, a.2013) Suponha que foi pedida a escrita de um mtodo max o qual aceita como
parmetro uma pilha de inteiros e que retorna o maior inteiro contido na pilha. Algum fez a codificao
como se segue, preocupando-se admiravelmente em citar a precondio de que a pilha no esteja vazia
para que o cdigo funcione:
//Precondio: !s.isEmpty()
public static void max(Stack s) {
int maxValue = s.pop();
while (!s.isEmpty()) {
int popped = s.pop();
if (maxValue < popped)
maxValue = popped;
}
return maxValue;
}
O cdigo foi testado e apresentou problemas mesmo com pilhas passadas no vazias? Qual o problema
desse cdigo?
5. (Sedgewick, a.2012) [] Suponha que operaes de push() e pop() so efetuadas ao acaso em uma pilha.
As operaes de push() colocam inteiros em ordem estritamente crescente na pilha (ou seja, uma vez que
o usurio coloca um nmero na pilha, o prximo dever ser maior). A cada pop() efetuado, o valor removido
da pilha impresso. Qual das sadas abaixo no pode ocorrer?
(a) 4 3 2 1 0 9 8 7 6 5
(b) 4 6 8 7 5 3 2 9 0 1
(c) 2 5 6 7 4 8 9 3 1 0
(d) 4 3 2 1 0 5 6 7 8 9
(e) 1 2 3 4 5 6 9 8 7 0
(f) 0 4 6 5 3 8 1 7 2 9
(g) 1 4 7 9 8 6 5 3 0 2
(h) 2 1 4 3 6 5 8 7 9 0
13/35
Estruturas de Dados I
Copywrite 2011-2013 by LCDG
7. (a.2013) [Explique o que so expresses prefixadas, infixas, e psfixadas. D um exemplo para cada (2 ou
3 operaes, ilustrando a precedncia, etc.).
8. (a.2013) [ Escreva as expresses abaixo da notao infixa para a psfixa (^ o operador expoente que tem
precedncia maior que os demais. a^b o mesmo que ab)
(x + y z)/(h + k)*s, j k/g^h + (n + m) e a*(b c)/d + e*f
12. (a.2013) Enunciado curto: Escreva um cdigo caprichado com um menuzinho que mostre as
operaes de pilha para um usurio.
Enunciado extenso (no sei como fazer algo pedido como um enunciado to vago como o
anterior): Escreva o cdigo com um menuzinho que mostre as operaes de pilha para um usurio (cria
pilha com tal tamanho, empilha nmero, desempilha e mostra o que desempilhou, quando inserir um
nmero ou o cdigo gera um nmero ou pede um nmero ao usurio, etc., etc.). O estado da pilha sempre
deve ser mostrado e, obviamente, no deve haver estouros durante a execuo do cdigo.
13. (Sedgewick, a.2012) [] Escreva um trecho de programa que leia caracteres da entrada e que os
imprima em ordem reversa. Use uma pilha. Nada de contadores.
14. (Sedgewick, a.2012) [] Escreva um trecho de programa que leia um nmero indeterminado de doubles
positivos da entrada (a sequencia pode terminar em 0 ou em um double negativo). Em seguida criado um
array com o tamanho exato do nmero de doubles entrados. O array de doubles inicializado com os
doubles lidos na ordem reversa quela da leitura. Use uma pilha. Nada de contadores.
14/35
Estruturas de Dados I
Copywrite 2011-2013 by LCDG
15. (Preiss, a.2012) [] Escreva um algoritmo que traduza da notao psfixa para a prefixa.
Ex: w x y / z * / w x * y z.
w x y / - z * * - w / x y z
Sugesto (quase a soluo) que usa concatenao de strings e uma pilha: Letra lida empilhada.
Operador lido: dois caracteres da pilha de letras so popados, concatenados com o operador lido e
colocados de volta na pilha. Ou seja, a pilha de strings. Ao final da leitura da string de entrada, a pilha deve
conter apenas um elemento. Else, houve erro na expresso de entrada. Faz a bem feitinho, escrevendo
inicialmente para algo correto e adicionando os casos de expresso vazia e expresses erradas. Bem bacana
esse exerccio.
16. (Preiss, a.2012) [] Implemente uma fila utilizando duas pilhas. Fornea os algoritmos para enqueue e
dequeue. Quanto seria o O() para essa implementao?
Sugesto A (quase a soluo): Toda vez que ocorre um enqueue(), um dado pushado numa pilha A. Toda
a vez que ocorre um dequeue(), os dados existentes so invertidos pushando eles numa pilha B e retornado
e removido o ltimo pushado. Os dados so ento retornados pilha A. Note: enqueue() O(1) e dequeue()
O(2n).
Sugesto B (quase a soluo): Toda vez que ocorre um dequeue(), um dado popado numa pilha A. Toda
a vez que ocorre um enqueue(), os dados existentes so invertidos pushando eles numa pilha B, e inserido o
novo dado. Os dados so ento retornados pilha A. Note: dequeue() O(1) e enqueue() O(2n).
Sugesto C (quase a soluo): Ganha um brinde se fizer com o melhor mtodo. Existe a necessidade de se
manter um apontador para uma pilha corrente e tomar umas decises. Pense nas sugestes anteriores.
17. (LCDG, 2011, a.2012) [] Suponha duas pilhas. Uma pilha A inicialmente vazia e outra pilha B que ser
montada com objetos sua escolha (4 nmeros ou 10 letras, por exemplo). Monte main() de modo a que
a pilha B seja impressa NA ORDEM EM QUE OS ELEMENTOS ENTRARAM NELA e que
a pilha B volte ao estado inicial aps a impresso
RESPONDA COM UM CDIGO FEITO EM JAVA E TESTADO.
18. (LCDG, 2011, a.2012) [] Para uma implementao diferente de pilha, os itens so dispostos ao
contrrio no array, conforme a figura abaixo. Ou seja, a pilha cresce do ndice maior para o menor no
array. O ndice do topo dado por myTop. Suponha tambm que o array foi instanciado com tamanho 6
para resolver os itens de a) a e). Nada de implementar. Faa mo.
public class Stack {
private float[] myArray;
private int myTop;
// mais nenhum atributo
...
// o resto da classe est aqui
};
?
1
40,2
3,1
6,4
4,2
myTop
(a) Qual valor ter myTop quando a pilha estiver vazia? _____
(b) Qual valor ter myTop quando a pilha estiver cheia? _____
(c) Quantos itens a pilha acomoda? _____
(d) Qual valor ser o primeiro valor a ser removido da pilha da figura?_____
(e) Qual valor seria o ltimo valor a ser removido da pilha da figura?_____
(f) Codifique int push(float item), que insere um float na pilha. disposio existe boolean isFull()
para testar se a pilha est cheia. push()retorna o nmero de elementos que a pilha contm aps a
insero de item (no existe o mtodo lenght()). Caso haja erro, push() retorna o nmero mximo de
elementos que a pilha contm somado com 1.
15/35
Estruturas de Dados I
Copywrite 2011-2013 by LCDG
(g) Codifique void sumTwo(). Esse mtodo retorna a soma dos dois elementos mais ao topo, que devem
ser removidos da pilha, e a soma colocada no topo. Note: No necessrio fazer a verificao de
pilha vazia. pop() no foi implementado e no perca seu tempo com a implementao dele.
(h) Codifique o construtor.
22. (a.2013) Escreva um programa que determina se uma string consiste de um nmero de caracteres A
seguidos do mesmo nmero de caracteres 'B'. Use uma pilha. Nada de contadores.
16/35
Estruturas de Dados I
Copywrite 2011-2013 by LCDG
23. (UFOP, a.2012) [] Escreva um mtodo que determine se uma string da forma s = wCwR, onde w
uma string e wR a string reversa de w, sendo que w contm apenas os caracteres A e B. Por exemplo,
para w= ABABBA, s = ABABBACABBABA. Mandatoriamente, a string s lida da esquerda para a
direita apenas, caracter a caracter. Utilize uma pilha. Nada de contadores.
24. (UFOP, a.2012) [] Escreva um mtodo que determine se uma string da forma
s = w1Dw1RDw2Dw2RDw3Dw3R... wnDwnR
onde cada wj uma string e wjR a string reversa de wj, sendo que wj contm apenas os caracteres A e B.
Mandatoriamente, a string s lida da esquerda para a direita apenas, caracter a caracter. Utilize uma pilha.
Nada de contadores.
25. (UFOP, a.2012) [] Considere uma pilha P vazia e uma fila F no vazia, ambas sendo containers do
mesmo tipo (char, por exemplo). Utilizando apenas os predicados isEmpty(), as operaes enqueue(),
dequeue(), push(), e uma varivel auxiliar aux do mesmo tipo que F e P contm, escreva um mtodo que
inverta a ordem dos elementos da fila. Nada de contadores.
17/35