在队列中,“头”是哪一端?


18

我一直以为队列的“头”是要读取的下一个元素,从来没有真正质疑过这种用法。因此,我写的一个用于维护队列的链接列表库使该术语变得更加合理:我们有一个list1_head宏可以检索第一个元素;在队列中使用此库时,这将是第一个要删除的元素。

但是团队中的一位新开发人员习惯于以其他方式实现队列。他将队列描述为像狗一样行为:您将其插入头部,然后将其移至尾部。这是一个足够聪明的描述,我觉得他的用法必须更广泛,而且我没有类似的令人回味的描述。

因此,我想有两个相关的问题:1,队列的“头”对您意味着什么?2,为什么我们用“头”一词来描述这个概念?


1
“他形容一个队列像一条狗一样”。
NoChance 2012年

1
我不知道,但是我会猜到您的实现,而不是狗狗。
Izkata 2012年


同样,在教科书中,通常在其他数据结构(例如堆栈和队列)之前先引入(单)链接列表,然后将它们建立在链接列表结构之上(这不一定是当今构建这些数据结构的首选方式,因为缓存未命中)。链表通常会有一个头指针(指第一个元素)和一个尾指针(指最后一个元素)。在这种安排下,很容易在尾端插入从头上移出的-因此,在这种FIFO队列中,您是从头上移出的。但是请注意,这实际上是内部实现细节。
FilipMilovanović

顺便说一句,确实认为这部分是与语言有关的事情,但这也与我们如何概念化队列的工作有关。对于大多数了解“队列”一词的含义的人,或者对于具有这种隐喻(排队等候)的人而言,出口部分位于前/头。我怀疑您的朋友将它的概念更像是一种管道,将对象推入管道的一端(在某种意义上说是“起点”,或者说是“头”),然后在另一端退出。
FilipMilovanović18年

Answers:


29

您在队列的后面进入,然后从前面离开。在大多数社会中,这意味着头部是前部,物品已从头部移除。

QueueJavadoc似乎同意经典定义(即您的原始定义):

无论使用哪种顺序,队列的开头都是该元素,可以通过调用remove()或poll()将其删除。在FIFO队列中,所有新元素都插入队列的尾部。


4
C ++ STL也同意。
Fabio Ceconello 2012年

FIFO / LIFO的常用术语是从队列/堆栈的顶部删除。狗的顶部是头部,而不是尾巴。:-D
Spencer Kormos 2012年

看来您已经回答了第一个问题,通常情况下,我所理解的用法是传统用法...谢谢您的参考。但是,为什么队列的前面被称为“头”却不是那么
坚定

...那么我们要在哪个孔的狗上排队呢?;)
ell 2012年

1
狗的尾巴是队列的头。
Caleb 2012年

8

在美国,人们通常称其为专线电话,例如您在邮局所坐的东西,而其他英语国家的人则称为排队。因此,如果用“行”代替“队列”,美国人更容易保持术语直爽。换句话说,当您位于该行的开头或开头时,您将是下一个被呼叫的人。


那么,也许这更多是关于英语的问题,因为似乎已经出现的问题是“为什么我们称呼前台为首?”
艾丹·库利(Aidan Cully)

3
@AidanCully:因为身体的头部(在四足动物和其他水平放置的动物中)朝前或朝前。
outis 2012年

对于我们美国人来说,这是最好的解释。
andDevW

4

两种约定都是常用的。以我的经验,一般来讲队列时,头元素是队列中的下一个元素,尾元素是进入队列的位置。这与日常英语用法是一致的-我们排在后面,而下一个要排在前面或头上。(如果要剪切,它就在您的行尾!)

但是,当将队列(又名FIFO)实现为环形缓冲区时,这些术语通常会颠倒过来,因为环形缓冲区的已用部分类似于绕圈绕的蛇。假设蛇向前移动,头部自然是引导运动的一端,这也是插入传入物品的一端。


值得一提的是Linux内核中的循环缓冲区,该缓冲区使用以下约定:在开头添加项目,在结尾删除项目。
Craig McQueen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.