Difference between revisions of "Excepções (Java)/Exercício 01: Stack"

From Wiki**3

< Excepções (Java)
(Created page with "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 in...")
 
(Solução)
 
(4 intermediate revisions by the same user not shown)
Line 8: Line 8:
  
 
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).
 
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).
</div>
 
  
Ficheiro '''Stack.java''':
+
{{CollapsedCode|Ficheiro '''Stack.java'''|
<java5>
+
<source lang="java">
 
public class Stack {
 
public class Stack {
 
   private int[] _contents;
 
   private int[] _contents;
Line 31: Line 30:
  
 
   public boolean exists(Integer e) {
 
   public boolean exists(Integer e) {
     for (int i: _contents)
+
     for (int ix = 0; ix < _last; ix++)
       if (i == (int)e) return true;
+
       if (_contents[ix] == (int)e) return true;
 
     return false;
 
     return false;
 
   }
 
   }
  
 
}
 
}
</java5>
+
</source>
 +
}}
  
Ficheiro '''UStack.java''' (stack sem repetições):
+
{{CollapsedCode|Ficheiro '''UStack.java''' (stack sem repetições)|
<java5>
+
<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:
 
   }
 
   }
 
}
 
}
</java5>
+
</source>
 +
}}
  
Ficheiros '''StackOverflowException.java''' e '''StackUnderflowException.java''' (excepções):
+
{{CollapsedCode|Ficheiros '''StackOverflowException.java''' e '''StackUnderflowException.java''' (excepções)|
 
+
<source lang="java">
<java5>
 
 
public class StackOverflowException extends Exception {}
 
public class StackOverflowException extends Exception {}
</java5>
+
</source>
  
<java5>
+
<source lang="java">
 
public class StackUnderflowException extends Exception {}
 
public class StackUnderflowException extends Exception {}
</java5>
+
</source>
 +
}}
  
 
[[category:Ensino]]
 
[[category:Ensino]]

Latest revision as of 12:50, 29 October 2019

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 {}