使用模板类和循环数组实现动态双端队列2024 年 8 月 28 日 | 阅读 6 分钟 双端队列(Deque),也称为双向队列,是一种队列类型,可以在前端和后端进行插入和删除操作。双端队列是一种数据结构,它将栈和队列的功能结合到单一数据结构中。 在本教程中,我们将使用模板类和循环数组来创建一个动态双端队列。 使用模板类和循环数组,创建一个具有以下功能的动态双端队列 - front() 返回双端队列的第一个元素。
- size() 返回双端队列的元素数量。
- back() 返回双端队列的最后一个元素。
- capacity() 返回双端队列当前的最大元素数量。
- push back(X): 使用 push back 在双端队列的末尾插入 X。
- empty(): 检查双端队列是否为空。
- push front(X): 使用 push front 在双端队列的开头插入 X。
- pop front(): 从双端队列的开头移除一个元素。
- Pop back(): 从双端队列的末尾移除一个元素。
下面是分步说明 - 双端队列最初是空的。
- 将 1 添加到双端队列的末尾
- 将元素 2 和 3 添加到双端队列的末尾。
- 将 4 添加到双端队列的开头。
- 将 5 添加到双端队列的末尾。
- 从双端队列的开头选择两个元素,从末尾选择两个元素。
方法: 当数组容量达到上限时,其思路是将其大小加倍并将先前数组的元素复制到新数组中。按照以下步骤解决问题 - 要使用双端队列,请设置四个变量:frontIndex、backIndex、sizeVar 和 capacityVar,以及一个数组 arr[]。
- 编写一个名为 capacity() 的函数,它返回 capacityVar 变量的值并确定当前正在使用的数组的大小。
- 编写一个 size() 函数,它计算双端队列中的元素并返回 sizeVar 变量的值。
- 创建一个名为 full() 的函数,它检查双端队列是否已满,如果 sizeVar 等于 capacityVar,则返回 true。否则,返回 false。
- 编写一个 empty() 函数,它检查双端队列是否为空,如果 frontIndex 和 backIndex 都为 -1,则返回 true。否则,返回 false。
- 创建一个名为 Front() 的函数,它打印双端队列的第一个元素。如果双端队列不为空,则打印 arr[frontIndex] 处的元素。
- 创建一个 Back() 函数来打印双端队列的最后一个元素。如果双端队列不为空,则打印 arr[BackIndex] 处的元素。
- 创建一个 push back(X) 函数以在双端队列的末尾插入一个元素
- 如果双端队列已满,则将当前数组的大小加倍并将先前数组的元素复制到新数组中。
- 如果双端队列为空,将 frontIndex 和 backIndex 设置为 0,然后将 X 设置为 arr[frontIndex] 和 arr[backIndex],并将 sizeVar 递增 1。
- 如果不是,则将 backIndex 设置为 (backIndex+1)%capacityVar,将 X 分配给 arr[backIndex],并将 sizeVar 递增 1。
- 编写一个名为 push front(X) 的函数,它在双端队列的开头插入一个元素
- 如果双端队列已满,则将当前数组的大小加倍并将先前数组的元素复制到新数组中。
- 如果双端队列为空,将 frontIndex 和 backIndex 设置为 0,然后将 X 设置为 arr[frontIndex] 和 arr[backIndex],并将 sizeVar 递增 1。
- 如果不是,则将 frontIndex 更改为 (frontIndex-1 + capacityVar)%capacityVar,将 X 分配给 arr[frontIndex],并将 sizeVar 递增 1。
- 编写一个名为 pop front() 的函数,以从双端队列的开头删除一个元素
- 如果双端队列为空,则打印“下溢”。
- 如果 sizeVar 大于 1,则将 frontIndex 和 backIndex 都设置为 -1,并将 sizeVar 递减 1。
- 否则,应将 FrontIndex 更新为 frontIndex = (frontIndex+1)%capacityVar,并将 sizeVar 递减 1。
- 创建一个名为 pop back() 的函数,以从双端队列的开头删除一个元素
- 如果双端队列为空,则打印“下溢”。
- 否则,如果 sizeVar 等于 1,则将 frontIndex 和 backIndex 都设置为 -1,并将 sizeVar 递减 1。
- 否则,将 sizeVar 递减 1,并将 backIndex 更新为 backIndex = (backndex-1 + capacityVar)%capacityVar。
上述方法实现如下C++ 程序 输出 Current capacity 16
Current size 9
Front element 9
Rear element 8
Pop an element from front
Pop an element from back
Current capacity 16
Current size 7
Front element 7
Rear element 6
时间复杂度 将为 O(N)。 辅助空间 将为 O(N)。
|