什么是队列抽象数据类型?

时间:2013-12-14 20:51:41

标签: algorithm data-structures language-agnostic queue

我不清楚队列的想法。似乎这个术语含糊不清或者至少我对此感到困惑 虽然似乎对队列的最常见解释(例如在维基百科中)是它是符合FIFO原则的抽象数据类型,但实际上这个术语似乎具有更广泛的含义。
例如,我们有

  • 优先级队列,其中每个项目都是根据优先级检索的,

  • 我们有一个堆栈,它也是一种反向队列形式(LIFO),

  • 我们有消息队列,它们似乎只是一个没有的项目列表 通过将简单列表分类为队列
  • 进行排序

所以有人可以帮我解释为什么队列中有这么多不同的含义?

3 个答案:

答案 0 :(得分:4)

队列本质上是遵循FIFO原则作为其默认特性的数据结构。 让我们将这个队列视为我们日常生活中的队列。以火车站队列为例购买门票。

正常队列站在队列最前面的人获得票证,任何到达的新人都站在队列的末尾,等待轮到他获得票证。

优先级队列:假设您是站在该队列中间的VIP。售票员会立即通知您,并呼叫您到队列的前面来获取您的机票,即使轮到您购买也是如此。如果你不重要,队列将继续发挥其通常的作用,但只要任何元素被认为比另一个元素更重要,它就会被拾取,无论它在队列中的位置如何。但是,否则,队列的默认性质保持不变。

Stack:我们根本不要把它与队列混淆。堆栈的目的本质上与队列的目的不同。举一个洗过的菜肴放在你的厨房里的例子,洗过的最后一道菜是第一个被挑选的菜。因此,堆栈和队列在不同情况下可以发挥不同的作用,不应相互混淆。

消息队列:与优先级队列的情况一样,此队列的默认特性是首先读取首先出现的消息,而即将出现的消息在队列中排队等待他们的转向,除非一条消息被认为比另一条消息更重要,并且在它正常转弯之前被调到队列的前面。

因此,任何类型的队列的默认性质都保持不变,它继续遵循其FIFO原则,除非在特殊情况下不这样做。

希望有所帮助

答案 1 :(得分:3)

通常,队列会为项目输入并最终选择和删除的等待区域建模。但是,不同的队列可以具有不同的scheduling policies,例如先进先出(FIFO),后进先出(LIFO),优先级或随机。例如,排队论将所有这些作为队列解决。

但是,在计算机科学/编程中,我们通常使用“queue”一词专门指代FIFO队列,并使用其他词(堆栈,优先级队列等)作为其他调度策略。在实际操作中,您应该在听到单词队列时假设FIFO,但不要完全排除发言者可能更普遍地使用该单词的可能性。

顺便说一下,类似的问题出现在“堆”这个词上,根据上下文,它可能指的是优先级队列的特定实现或一般的优先级队列(或者,在一个大多数无关的意义上,指的是用于动态分配的内存。)

答案 2 :(得分:-1)

优先级队列:它不是队列。看一下:http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html它没有实现Queue接口。

堆栈:它不是队列。看一下:http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html它没有实现Queue接口。

消息队列:我不知道它是什么。

队列:队列只有一个含义,先到先得的人也会先获得服务。

队列ADT:它是一个接口,意味着它有很多功能。最常见的:添加 - 添加到行的末尾,从行的开头删除 - 删除。 http://docs.oracle.com/javase/7/docs/api/java/util/Queue.html