数据结构论坛

首页 » 分类 » 问答 » 什么是数据结构Queue
TUhjnbcbe - 2025/7/21 16:22:00

这篇文章中,我们将重温一下Java中的队列。队列是一个线性数据结构,它的工作非常直观且易于理解。与遵循LIFO(后进先出)原则的堆栈不同,队列遵循FIFO(先进先出)原则。换句话说,在队列数据结构中,我们删除的都是最近的项目。这就好比超市排队结账,先排队的人就先结完账,先走。

队列支持的四种基本操作:

enqueue():enqueue方法将一项添加到队列中dequeue():dequeue方法从队列中删除最近添加的项front():front方法返回队列前面的项rear():该方法返回队列末尾的项,即最近插入的项

除了这四个基本操作之外,我们当然也会受益于一些辅助方法:

size():返回队列中的项目数isFull():如果队列已满,则为TrueisEmpty():如果队列为空则为True

我们还需要一些私有变量,用于跟踪队列中的位置,以及实际队列的内部数组:

front:前部元素的当前位置rear:后部元素的当前位置size:队列的当前大小(项目数)array:内部数组,包含队列中的实际项

我们还将使我们的类具有通用性,避免使用只能将原生int“对象”插入到Queue中的一般示例,我们队列的代码框架如下所示:

图一图二图三

如果您阅读了类注释,您可能已经注意到引入了两个新的术语:RingBuffer和CircularQueue。我们希望我们的内部数组充当环形缓冲区,这意味着如果前面或后面到达数组的最后位置,我们将重新连接到数组的开头。

为了解释为什么我们应该创建一个循环队列,我们首先要解释如果我们只是创建一个线性队列我们将遇到的问题。假设您有一个可以包含总共五个元素的队列,则对队列执行以下操作:

enqueue(1).Front=0,rear=0.enqueue(2).Front=0,rear=1.enqueue(3).Front=0,rear=2.dequeue().Front=1,rear=2.dequeue().Front=2,rear=2.enqueue(4).Front=2,rear=3.enqueue(5).Front=2,rear=4.执行这些操作后,队列将如下所示:

如您所见,队列中有2个可用的点,索引0和1。但是,如果队列不是循环的,如果我们试图将数字6排队,会发生什么?如果您猜到队列将报告为已满,那么您是对的!要解决这个问题,我们需要使队列循环。如果已达到队列末尾(假设队列未满),我们希望前后都重置回位置0。

现在,让我们完成代码框架并编写一个循环队列。

图一图二图三图四

我还在JUnit中编写了一个简单的单元测试。

图一图二
1
查看完整版本: 什么是数据结构Queue