在本文中,我们将讨论队列数据结构,其操作以及如何使用Java中的数组实现这些操作。
什么是队列?
队列是线性数据结构,由遵循先进先出序列的项的集合组成。这意味着要插入的第一个项目将是第一个要删除的项目。您也可以说项目是按照其插入顺序删除的。
使用一个真实的例子,我们可以将队列数据结构与排队等待服务的个人队列进行比较。一旦一个人被照顾,他们就会离开队列,等待下一个人被照顾。他们按照他们来的顺序得到帮助。
队列的结构
队列主要由两部分组成:前/头和后/尾/后。为了清晰和一致,我们将坚持使用正面和背面。
背面是插入项目的位置,正面是队列中移除/删除项目的部分。
这是一个图表,以帮助您更好地理解:
该图显示了一个包含各种单元格的数组。物品通过背面插入,并通过正面移除。有一些术语用于插入和删除队列中的项目,我们将在下一节中介绍。
请注意,您可以反转队列的结构 - 您可以将前面放在右侧,将后面放在左侧。无论您使用哪种结构,请始终记住,通过背面插入项目,通过正面删除。
队列的常见操作
队列中通常使用以下操作:
排队:从队列后面添加项目。
取消排队:从队列前面删除项目。
前面/速览:返回队列前面的项的值,而不对项进行排队(删除)。
是空的:检查队列是否为空。
已满:检查队列是否已满。
显示:打印队列中的所有项目。
在了解如何使用代码实现此目的之前,您需要了解排队和取消排队操作的工作原理以及它们如何影响前后位置。
大多数编程语言中的数组索引从 0 开始。在实现代码时,我们将数组的前后值的索引设置为 -1。这将使我们能够在添加值时正确移动前后位置。
请考虑下图:
箭头显示数组正面和背面的位置。当两个位置都位于 -1 时,表示数组为空。
让我们将一些项添加到数组中,看看会发生什么。
我们插入(排队)了我们的第一个项目 - 5。正面和背面的位置也发生了变化。接下来,我们将看到当我们排队更多项目时会发生什么
已添加第二个项目,但仅向后移动。随着我们排队购买更多项目,这种情况将继续下去。在上一个示例中,正面和背面一起移动,以便正面可以占据第一项的位置。
由于这是当时第一个也是唯一一个物品,因此正面和背面都坐在那个位置。但是现在我们已经排队了更多的项目,后面将继续跟随最后一个项目。
我们将继续填充数组,以便我们可以看到取消排队时会发生什么。
因此,后退箭头按照项目添加到最后一个的顺序跟随项目。现在让我们删除(取消排队)一些项目。
还记得先到先出的顺序吗?当我们执行取消排队操作时,它将首先从队列中删除 5。如果我们再次执行它,那么它将移动到下一个数字,即10,并按照该顺序继续,只要我们调用它。
这里,第一个取消排队操作:
现在,前箭头已移至索引 1。这意味着索引 0 处的项目已被删除。通过删除,我们并不意味着从数组中,而是从队列中移除 - 只有从前位置到后位置的项目是队列的一部分。
按照相同的顺序,如果我们继续删除项目,它将到达队列末尾的前箭头与后箭头相遇的点。如果我们在这一点上再次取消排队,前面的箭头将移动超过后面的箭头,然后队列将被视为空,因为那里没有要删除的内容。发生这种情况时,我们会将其索引重置为 -1(初始起始点)。
是时候编写一些代码了!
在 Java 中实现队列
我们将通过创建每个操作,然后在最后将所有内容放在一起来分解此部分。
我们已经创建了变量及其参数。我们使用 3 作为数组中可以排队的最大项数。就像我们在上一节中的图像中看到的那样,我们已将正面和背面的初始索引设置为 -1。
接下来,我们将定义“是空”和“是完整”功能。
对于空的:
如果你在上一节中继续,很容易掌握。仅当正面和背面的索引为 -1 时,数组才为空。
对于是完整的:
这个可能看起来有点棘手,但这是逻辑:数组中允许的最大项目数为3,但数组中的三个项目不由索引3表示,而是用2表示,因为第一个索引是0。因此,最大长度减去 1 给我们的索引 2,它是数组中的第三个单元格。
当所有单元格都已使用第三个单元格之前的值排队时,数组将已满。
对于队列:
如果数组已满,则我们收到一条消息,指出它已满。如果正面和背面为 -1,则将项目分配给索引为 0 的第一个单元格 – 否则,将插入该值并递增后位置。
对于取消排队:
在这里,如果数组为空,我们得到相应的消息。如果前面与后面相遇,我们会将其索引重置回 -1,就像我们在上一节中的图像中看到的那样。如果最后两个条件不适用,则前面递增。
对于显示:
在这里,如果数组不为空,我们将遍历并打印所有项目。
最后,为了一窥:
这仅打印正面项目的值。
这些是我们队列的所有操作。以下是所有这些内容:
现在让我们执行操作:
enQueue(3)将 3 插入到我们的队列中,类似于接下来的两行代码。
display()打印出数组中的项。
peak()打印前面的项的值。
我们没有执行,因此您可以继续自己尝试 - 显示您的数组并在取消排队后看一看,看看会发生什么。有多种方法可以修改代码,所以玩得开心!deQueue
现在让我们执行操作:
enQueue(3)将 3 插入到我们的队列中,类似于接下来的两行代码。
display()打印出数组中的项。
peak()打印前面的项的值。
我们没有执行,因此您可以继续自己尝试 - 显示您的数组并在取消排队后看一看,看看会发生什么。有多种方法可以修改代码,所以玩得开心!deQueue
结论
在本文中,我们定义了一个队列及其结构。我们继续看到一些使用图像的示例,以显示队列的前后位置在项目排队和取消排队时如何反应。最后,我们看到了如何使用Java中的数组实现队列数据结构。