Em uma fila, qual extremidade é a "cabeça"?

18

Eu sempre pensei que o "cabeçalho" de uma fila era o próximo elemento a ser lido, e nunca questionei esse uso. Portanto, uma biblioteca de lista vinculada que escrevi, usada para manter filas, codificou essa terminologia: temos uma list1_headmacro que recupera o primeiro elemento; ao usar esta biblioteca em uma fila, este será o primeiro elemento a ser removido.

Mas um novo desenvolvedor da equipe estava acostumado a ter filas implementadas ao contrário. Ele descreveu uma fila como se comportando como um cachorro: você insere na cabeça e remove na cauda. Essa é uma descrição suficientemente inteligente para que eu ache que o uso dele deve ser mais difundido e não tenho uma descrição igualmente sugestiva do uso preferido.

Então, acho que existem duas questões relacionadas: 1, o que o "cabeçalho" de uma fila significa para você? e 2, por que usamos a palavra "cabeça" para descrever esse conceito?

Aidan Cully
fonte
1
"Ele descreveu uma fila como se comportando como um cachorro" ... Parece um cara divertido de se trabalhar - não o deixe perto de um cliente.
NoChance
1
Eu não sei, mas eu teria adivinhado a sua implementação, não a do cachorro.
precisa saber é o seguinte
Outra boa explicação sobre a diferença entre fila e PILHA: http://pages.cs.wisc.edu/~mcw/cs367/lectures/stacks.html
Ythalo Rossy
Além disso, nos livros didáticos, a lista vinculada (individual) geralmente é apresentada antes de outras estruturas de dados, como pilha e fila, e depois são construídas sobre a estrutura de lista vinculada (que não é necessariamente a maneira preferida de criar essas estruturas de dados hoje porque falhas de cache). Uma lista vinculada geralmente possui um ponteiro de cabeça (refere-se ao primeiro elemento) e um ponteiro de cauda (ao último); nesse arranjo, é fácil inserir no final da cauda e remover da cabeça - portanto, em uma fila FIFO, você remove da frente. Mas observe que esse é realmente um detalhe interno da implementação.
Filip Milovanović
BTW, acho que é parcialmente uma coisa relacionada à linguagem, mas também é sobre como conceituamos o que uma fila faz. Para a maioria das pessoas que conhecem o significado da palavra "fila" ou são introduzidas no conceito com essa metáfora (aguardando na fila), a parte de saída fica na frente / na cabeça; Eu suspeito que seu amigo o conceitua mais como um tipo de pipeline, em que você empurra objetos em uma extremidade (o início, ou em algum sentido, a "cabeça") do tubo, e eles saem na outra extremidade.
Filip Milovanović

Respostas:

29

Você entra na parte de trás da fila e sai pela frente. Na maioria das sociedades, isso implicaria que a cabeça é a frente e os itens são removidos da cabeça.

O Javadoc para fila parece concordar com a definição clássica (ou seja, a sua original):

Qualquer que seja a ordem usada, o cabeçalho da fila é o elemento que seria removido por uma chamada para remove () ou poll (). Em uma fila FIFO, todos os novos elementos são inseridos no final da fila.

Spencer Kormos
fonte
4
O C ++ STL também concorda.
Fabio Ceconello
Também terminologia comum para FIFO / LIFO é remover da parte superior da fila / pilha. O topo do cachorro é a cabeça, não a cauda. :-D
Spencer Kormos
Parece que você respondeu à 1ª pergunta, é realmente comum o uso que eu entendi ser tradicional ... Obrigado pelas referências. Mas não é como o ferro-folheados para mim por que a frente da fila é chamado de "cabeça" ...
Aidan Cully
... então em qual orifício do cão enfileiramos itens? ;)
ell
1
A cauda de um cachorro é a cabeça da fila.
Caleb
8

O que as pessoas nos Estados Unidos costumam chamar de linha, assim como nas agências dos correios, as pessoas em outros países de língua inglesa chamam uma fila. Portanto, é mais fácil para os americanos manter a terminologia correta se você substituir "linha" por "fila". Em outras palavras, quando você está na cabeça ou na frente da linha, você é o próximo a ser chamado.

Karl Bielefeldt
fonte
Talvez essa seja mais uma pergunta sobre o inglês, então, porque a questão que parece ter surgido é "por que chamamos a frente de cabeça?"
Aidan Cully
3
@AidanCully: porque a cabeça de um corpo é (em quadrúpedes e outros animais orientados horizontalmente) para a frente ou para a frente.
Outis 15/04
Essa é a melhor explicação possível para nós, americanos.
andDevW 15/05
4

Ambas as convenções são de uso comum. Na minha experiência, ao falar sobre filas em geral, o elemento head é o próximo a sair da fila, e a cauda é onde os elementos entram na fila. Isso é consistente com o uso diário do inglês - entramos na fila atrás e o próximo a ser servido é na frente ou na cabeça. (E se você cortar, é o fim da linha para você!)

No entanto, quando uma fila (aka FIFO) é implementada como um buffer de anel , os termos são normalmente revertidos, porque a parte usada do buffer de anel se assemelha a uma cobra andando em círculos. Supondo que a cobra esteja avançando, a cabeça é naturalmente o fim que lidera o movimento, que também é o fim no qual os itens recebidos são inseridos.

IJ Kennedy
fonte
Vale mencionar buffers circulares no kernel do Linux , que usam a convenção de que itens são adicionados à cabeça e removidos na cauda.
Craig McQueen