bug. head por ser depois de tail.
joaoarthurbm opened this issue · comments
Professor, comentei sobre esse bug com o senhor no lcc e fui estudar um pouco mais. Notei alguns erros possíveis na execução dessa iteração de forma circular.
Vou utilizar o método toString()
como explicação...
- Primeiramente, utilizei um
for
, com o passoi = (i + 1) % this.fila.length
para iterar de forma circular na fila!
E como a posição de head
pode estar à frente de tail
, ou vice-versa, a única condição de parada correta é : i == this.tail
Mas acabei percebendo que utilizando um for com a condição : i != this.tail
, acontecem dois erros:
1º Erro) Ao atingir o índice do tail
, o loop terminará sem executar uma última iteração.
Pensei então, em usar outra condição de parada: i != (this.tail + 1) % this.fila.length
. Isso assegura que o loop seja encerrado após a execução do i == this.tail
, pois a condição estaria satisfeita e finalizaria no seu sucessor.
2º Erro) Esta solução anterior também está errada, pelo fato do sucessor de tail
poder ser igual ao head
.
Caso seja, a fila estará cheia, fazendo com que a iteração fosse interrompida na primeira execução, já que int i = this.head
.
Portanto, a única saída possível foi fazer com que, quando i == this.tail
o loop ainda fosse executado uma última vez.
Minha solução foi usar um while(true)
com a condição de parada sendo executada no meio do loop, o que também funciona quando temos apenas um elemento na fila, ou seja, head == tail
public String toString() {
String out = "";
if (!isEmpty()){
int i = this.head;
while (true){
out += this.fila[i];
if (i == this.tail) break; // Condição de parada para fila circular;
out += ", ";
i = (i + 1) % this.fila.length; // mantendo o índice circular;
}
}
return out;
}