Livro de Sedgewick e Wayne: sec.1.3, p.120. Website do livro: resumo sec.1.3, slides. Veja também a página algs4.cs.princeton.edu/code/, que tem o código fonte, a documentação, e dados de teste de todos os programas do livro.
O conceito de pilha já é bem conhecido do leitor. Esta página examina o conceito como exemplo de ADT (e aproveita para introduzir alguns recursos da linguagem Java).
Resumo:
Pré-requisitos:
voltarde um browser, cálculo do valor de uma expressão aritmética.
public class Stack<Item>
| ||
Stack() | construtor: cria uma pilha de Items vazia | |
void | push(Item item) | insere item nesta pilha |
Item | pop() | remove o Item mais recente desta pilha |
boolean | isEmpty() | esta pilha está vazia? |
int | size() | número de Items nesta pilha |
public class ClienteDePilha { public static void main(String[] args) { Stack<String> pilha; pilha = new Stack<String>(); while (!StdIn.isEmpty()) { String str = StdIn.readString(); if (!str.equals("-")) pilha.push(str); else if (!pilha.isEmpty()) StdOut.print(pilha.pop() + " "); } StdOut.println("(" + pilha.size() + " left on stack)"); } }
% javac ClienteDePilha.java % more tobe.txt to be or not to - be - - that - - - is % java ClienteDePilha < tobe.txt to be not that or be (2 left on stack)
StdIn StdOut push pop 0 1 2 3 4 to to be to be or to be or not to be or not to to be or not to - to to be or not be to be or not be - be to be or not - not to be or that to be or that - that to be or - or to be - be to is to is
public class StackRA<Item> { private Item[] a; private int N; // construtor public StackRA() { a = (Item[]) new Object[2]; N = 0; } // a pilha mora em a[0..N-1] public boolean isEmpty() { return N == 0; } public void push(Item item) { if (N == a.length) resize(2 * a.length); a[N++] = item; } public Item pop() { Item item = a[--N]; if (N > 0 && N == a.length/4) resize(a.length/2); return item; } private void resize(int max) { Item[] temp; temp = (Item[]) new Object[max]; for (int i = 0; i < N; i++) temp[i] = a[i]; a = temp; } }
newno cliente e cria uma instância da classe StackRA.
public class StackL<Item> { private Node first; private class Node { Item item; Node next; } public boolean isEmpty() { return first == null; } public void push(Item item) { Node oldfirst = first; first = new Node(); first.item = item; first.next = oldfirst; } public Item pop() { Item item = first.item; first = first.next; return item; } public static void main(String[] args) { StackL<String> s = new StackL<String>(); while (!StdIn.isEmpty()) { String item = StdIn.readString(); if (!item.equals("-")) s.push(item); else if (!s.isEmpty()) StdOut.print(s.pop() + " "); } StdOut.println("(" + s.size() + " left on stack)"); } }
profissionale também usa uma lista ligada; veja a API correspondente.
Resposta: Faz com que o método ou variável valha para a classe como um todo. Assim, não é preciso criar uma instância da classe para aplicar um método to tipo static. Os métodos das classes Math e StdOut, por exemplo, são todos static.
Resposta: Por razões técnicas, Java não permite criar vetores (= arrays) de tipo genérico, como Item[]. É preciso então criar um vetor do tipo Object[] e depois aplicar um cast a esse vetor.
Resposta: Object é a classe que inclui todas as demais classes. Em outras palavras, todas as classes em Java são subclasses da classe Object. Assim, todas as classes herdam os métodos de Object (como equals(), por exemplo), embora em geral as subclasses redefinam esses métodos.
Resposta: Ao declarar como private a classe aninhada Node, o acesso a Node fica restrito aos métodos e variáveis de instância que estão na classe que contém Node. As variáveis de instância de uma classe aninhada privada podem ser acessadas diretamente da classe que a contém mas de nenhum outro lugar, de modo que não há necessidade de declarar as variáveis de instância como public ou private.
Resposta:
O livro responde:
Nós as estamos usando, mas preferimos
embrulhá-las em um modelo abstrato mais simples.
As bibliotecas Java por tras de StdIn e StdDraw
foram criadas para ambientes de produção
e portanto as bibliotecas e suas APIs são um tanto pesadas.
Para ter uma ideia de como elas são,
veja os códigos de
StdIn,
StdOut
e
StdDraw.