Excepções (Java)/Exercício 01: Stack

From Wiki**3

The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Este exercício saiu no teste de 2013/02/04.

Problema

Escreva em Java a classe Stack que usa vectores de dimensão fixa (definida no momento da criação) para guardar inteiros e tem 3 métodos: insert(Integer e) (insere o elemento e na pilha), remove() (remove o último elemento inserido na pilha) e exists(Integer e) (devolve true se o elemento e existe na pilha e false em caso contrário). Também deve ser definida outra classe que difere da anterior por não permitir a existência de elementos duplicados na pilha, ou seja, o método insert(Integer e) não insere o elemento e se já existir na pilha. Quando a pilha está vazia e se tenta remover um elemento e quando está cheia e se insere um novo elemento, devem ser lançadas excepções.

Solução

A solução contém quatro classes (2 stacks e 2 excepções). Note-se que a solução é mínima e que algumas opções não são ideais em casos gerais (o uso de vectores fixos, por exemplo).

'Ficheiro Stack.java'
public class Stack {
  private int[] _contents;
  private int _last = 0;

  public Stack(int size) {
    _contents = new int[size];
  }

  public void insert(Integer e) throws StackOverflowException {
    if (_last == _contents.length) throw new StackOverflowException();
    _contents[_last++] = e;
  }

  public void remove() throws StackUnderflowException {
    if (_last == 0) throw new StackUnderflowException();
    _last--;  // in fact, it does not change the stack
  }

  public boolean exists(Integer e) {
    for (int ix = 0; ix < _last; ix++)
      if (_contents[ix] == (int)e) return true;
    return false;
  }

}
Ficheiro UStack.java (stack sem repetições)
public class UStack extends Stack {
  public UStack(int size) { super(size); }

  @Override
  public void insert(Integer e) throws StackOverflowException {
    if (!exists(e)) super.insert(e);
  }
}
Ficheiros StackOverflowException.java e StackUnderflowException.java (excepções)
public class StackOverflowException extends Exception {}
public class StackUnderflowException extends Exception {}