joaoarthurbm / eda-implementacoes

Data structure and algorithms support material

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

bug. head por ser depois de tail.

joaoarthurbm opened this issue · comments

for (int i = head; i <= tail; i += 1 % this.fila.length) {

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 passo i = (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;
    }