SóProvas


ID
748105
Banca
CESGRANRIO
Órgão
Petrobras
Ano
2012
Provas
Disciplina
Programação
Assuntos

As classes Java a seguir representam, respectivamente, uma fila e seus nós.

public class Fila {
         No ini=null; // referência para o primeiro elemento da fila
         No fin=null; // referência para o último elemento da fila

         public No insere(No n)
         {
         }
}

public class No {
        No prox;
        int info;

         public No(int i)
         {
                 info=i;
         }
}


Qual implementação do método insere() permite inserir corretamente um novo elemento na fila, preservando a sua
semântica?

Alternativas
Comentários
  • Alguém pode me explicar essa questão?

  • Felipe, também achei a questão meio chata de resolver, mas segue como chegar à resposta.
    Imagine uma fila de caixa de banco. Considere que a letra 'O' é uma pessoa na fila. A seguir, temos 4 pessoas na fila.
    null - O - O - O - O

    O quarto O, lendo da esquerda para a direita, que está em negrito e sublinhado é o primeiro da fila, e seria o no ini da questão.
    O primeiro O, lendo da esquerda para a direita, que está em negrito e itálico é o último da fila, e seria o no fin da questão.
    As setas representam a referência ao No prox. Elas andam para trás, pois consideram que o início da fila é a primeira pessoa à direita, logo, o próximo a ser atendido, é o que está imediatamente atrás, ou seja, à esquerda. Assim, o terceiro O é o No prox do quarto O, o  segundo O é o No prox do terceiro O, e assim por diante. A lógica da fila é está, então, vamos às alternativas.

    A) fin = n;
        fin.prox = n;
    Perceba que estas duas linhas não formam uma fila corretamente. Supondo que n seja uma pessoa nova que chega na fila, os comandos acima, fazem o fim da fila apontar para essa nova pessoa (ok), e fazem a referência ao próximo apontar para essa mesma pessoa, criado um ciclo. É como se essa nova pessoa na fila fosse a última pessoa e o próximo depois dela fosse ela mesma, entende? Não faz sentido. Errada.

    B) O comando for assusta, mas ele está somente caminhando entre os nós. Considerando nosso exemplo, o ant iria "andando" por entre as pessoas da fila, e terminaria apontando para a última pessoa da fila. Na verdade, não precisaria perder tempo nesse for, o que invalida de cara a questão, são as linhas:
    n.prox = ini;
    ini = n;
    Em nosso exemplo, n é a pessoa nova que está chegando na fila do caixa. O comando n.prox = ini, está dizendo que o próximo depois dessa pessoa nova que chegou na fila é a primeira pessoa da fila, isto é, ini. E o comando ini = n, está colocando essa pessoa que acabou de chegar no início da fila. Ou seja, fere o conceito de fila, pois o que está sendo feito é colocar a pessoa que acabou de chegar no início da fila, e aquela que já estava lá no início antes, passou a ser a próxima a ser atendida depois que essa novata chegou.
    Isso não é fila, isso seria uma pilha. Errada.

  • C) O comando fin = n, coloca a pessoa recém-chegada no final da fila, pois fin passa a apontar para n (que é a nova pessoa).O if (ini==null) ini=fin, só verifica se a fila está vazia. Se não tinha ninguém na fila antes, o início aponta para o fim da fila. Isso quer dizer que o início e o fim da fila são a mesma pessoa que acabou de chegar.O else ant.prox = n é a parte mais complicada. O ant está apontando para a última pessoa da fila antes dessa nova chegar (feito pelo comando for). O que este comando faz é: o próximo a ser atendido depois daquela última pessoa que estava na fila é essa pessoa nova que acabou de chegar. O que está correto.

  • D) Os comandos n.prox = ant.prox; e ant.prox = n criam um ciclo. Como n.prox faz referência a ant.prox e logo em seguida, ant.prox faz referência a n, logo, n.prox faz referência a n. De modo que o próximo a ser atendido após a pessoa que acabou de chegar é ela mesma. Não faz sentido. Outro erro é o if (n.prox==null) fin = n. Como n.prox é igual a n, não iria entrar nesse if e jamais executaria fin=n, deixando a fila sem a referência para o seu fim.

  • E) O comando n.prox = fin faz o próximo depois da pessoa que acabou de chegar ser a última pessoa que já estava na fila. Ou seja, se eu estava na fila antes de você chegar, eu era o final da fila, e passei agora a ser o próximo depois de você. É como se você tivesse furado fila e passado na minha frente.Por fim, o comando fin.prox = n, ainda cria um ciclo. Ou seja, você seria o próximo da fila depois de mim. Mas eu já era a próxima da fila depois de você. Criou-se um ciclo. Errada.Enfim, não sei se a explicação foi boa, mas fica difícil explicar esse tipo de questão sem usar elementos gráficos.