На черзі, який кінець є "головою"?


18

Я завжди думав, що "голова" черги як наступний елемент, який слід прочитати, і ніколи насправді не ставив під сумнів це використання. Отже, я написав бібліотеку з пов'язаним списком, яка використовується для підтримки черг, кодифікувала цю термінологію: у нас є list1_headмакрос, який отримує перший елемент; при використанні цієї бібліотеки в черзі це буде перший елемент, який буде видалено.

Але новий розробник у команді звик до того, щоб черги реалізовувались навпаки. Він описав чергу, як поводиться як собака: ти вставляєш біля голови, а прибираєш у хвіст. Це досить розумний опис, який я вважаю, що його використання повинно бути більш розповсюдженим, і я не маю аналогічно сприятливого опису мого кращого використання.

Отже, я здогадуюсь, є два суміжні питання: 1, що для вас означає "голова" черги? та 2, чому ми використовуємо слово "голова" для опису цього поняття?


1
"Він описав чергу, як він поводиться як собака" ... Звучить, як весело працювати з хлопцем - Не дозволяйте йому поруч із клієнтом.
NoChance

1
Я не знаю, але я б здогадався про вашу реалізацію, а не про собаку.
Ізката

Ще одне добре пояснення про різницю між QUEUE та STACK: http://pages.cs.wisc.edu/~mcw/cs367/lectures/stacks.html
Ythalo Rossy

Крім того, у підручниках (окремо) пов'язаний список часто вводиться перед іншими структурами даних, такими як стек і черга, а потім вони будуються поверх структури зв'язаного списку (що не обов'язково є кращим способом побудови цих структур даних сьогодні, оскільки пропусків кеша). Зв'язаний список часто має вказівник голови (відноситься до першого елемента) та вказівник хвоста (на останній); в цьому розташуванні легко вставити на хвостовому кінці витягнути з голови - так, у такій черзі FIFO ви знімаєте спереду. Але зауважте, що це дійсно внутрішня деталь реалізації.
Філіп Мілованович

До речі, думайте, що це частково пов'язане з мовою, але це також про те, як ми розуміємо, що робить черга. Для більшості людей, які знають значення слова "черга" або знайомі з цим поняттям метафорою (чекаючи в черзі), частина виходу знаходиться спереду / головою; Я підозрюю, що ваш друг розуміє це більше як річ з трубопроводу, де ви торкаєте предмети в одному кінці (початок, або в якомусь сенсі, "голова") труби, а вони виходять з іншого кінця.
Філіп Мілованович

Відповіді:


29

Ви входите в задній частині черги і виїжджаєте спереду. У більшості товариств це означає, що голова - це фронт, а предмети видаляються з голови.

Javadoc для черги , схоже, згоден з класичним визначенням (тобто вашого оригіналу):

Незалежно від використовуваного замовлення, головою черги є той елемент, який буде видалено закликом до видалення () або опитування (). У черзі FIFO усі нові елементи вставляються у хвіст черги.


4
STL C ++ також погоджується.
Фабіо Чеконелло

Також загальною термінологією для FIFO / LIFO є видалення зверху черги / стека. Верх собаки - голова, а не хвіст. :-D
Спенсер Кормос

Здається, що ви відповіли на перше запитання, насправді зазвичай трапляється так, що використання, яке я зрозумів, є традиційним ... Дякую за довідку. Але мені це не так залякано залізом, чому передню частину черги називають "головою" ...
Айдан Каллі

... так в якому отворі собаки ми зав'язуємо предмети? ;)
ell

1
Хвіст собаки - голова черги.
Калеб

8

Те, що люди в США зазвичай називають лінією, як у тому, що ви стоїте на пошті, люди в інших англомовних країнах викликають чергу. Отже, американцям простіше дотримуватися термінологію прямо, якщо ви заміните "рядок" на "чергу". Іншими словами, коли ви знаходитесь в голові або спереду лінії, ви наступним, кого будете викликати.


Можливо, це більше питання щодо англійської мови, тому що питання, яке, схоже, виникло - це "чому ми називаємо передню голову?"
Айдан Каллі

3
@AidanCully: бо голова на тілі (у чотириногих та інших тварин орієнтована горизонтально) спрямована вперед, або спереду.
outis

Це найкраще пояснення для нас, американців.
andDevW

4

Обидві конвенції є загальними. З мого досвіду, коли ми говоримо про черги загалом, головний елемент - наступний, який вийде з черги, а хвіст - там, де елементи входять у чергу. Це відповідає повсякденному використанню англійської мови - ми виходимо на лінію ззаду, а наступна, яку потрібно подавати, - спереду або на голові. (І якщо ви вирізаєте, це для вас на звороті лінії!)

Однак, коли черга (також FIFO) реалізована як буфер кільця , умови, як правило, зворотні, тому що використана частина кільця буфера нагадує змію, що йде по колу. Припускаючи, що змія рухається вперед, голова - це, природно, кінець, який веде рух, який також є кінцем, в який вставляються вхідні предмети.


Варто згадати круглі буфери в ядрі Linux , в яких використовується умова про те, що елементи додаються в голові та видаляються в кінці.
Крейг МакКуїн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.