(→Solução) |
(→Solução) |
||
Line 10: | Line 10: | ||
{{CollapsedCode|Ficheiro '''Stack.java'''| | {{CollapsedCode|Ficheiro '''Stack.java'''| | ||
− | < | + | <source lang="java"> |
public class Stack { | public class Stack { | ||
private int[] _contents; | private int[] _contents; | ||
Line 36: | Line 36: | ||
} | } | ||
− | </ | + | </source> |
}} | }} | ||
{{CollapsedCode|Ficheiro '''UStack.java''' (stack sem repetições)| | {{CollapsedCode|Ficheiro '''UStack.java''' (stack sem repetições)| | ||
− | < | + | <source lang="java"> |
public class UStack extends Stack { | public class UStack extends Stack { | ||
public UStack(int size) { super(size); } | public UStack(int size) { super(size); } | ||
Line 49: | Line 49: | ||
} | } | ||
} | } | ||
− | </ | + | </source> |
}} | }} | ||
{{CollapsedCode|Ficheiros '''StackOverflowException.java''' e '''StackUnderflowException.java''' (excepções)| | {{CollapsedCode|Ficheiros '''StackOverflowException.java''' e '''StackUnderflowException.java''' (excepções)| | ||
− | < | + | <source lang="java"> |
public class StackOverflowException extends Exception {} | public class StackOverflowException extends Exception {} | ||
− | </ | + | </source> |
− | < | + | <source lang="java"> |
public class StackUnderflowException extends Exception {} | public class StackUnderflowException extends Exception {} | ||
− | </ | + | </source> |
}} | }} | ||
Este exercício saiu no teste de 2013/02/04.
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.
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 {}
|