Ai
1 Star 0 Fork 127

夜景/数据结构(C++模板实现)

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
double_ended_queue.h 17.23 KB
一键复制 编辑 原始数据 按行查看 历史
Y_Dash 提交于 2023-07-01 16:04 +08:00 . 更新readme
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635
/*!
* @file double_ended_queue.h
* @author cyberdash@163.com(抖音: cyberdash_yuan)
* @brief 循环双端队列
* @version 0.2.1
* @date 2023-06-03
*/
#ifndef CYBER_DASH_DOUBLE_ENDED_QUEUE_H
#define CYBER_DASH_DOUBLE_ENDED_QUEUE_H
#include <cstdlib>
#include <iostream>
#include "queue.h"
using namespace std;
template<typename TData> class DoubleEndedQueue;
template<typename TData> ostream& operator<<(ostream& os, const DoubleEndedQueue<TData>& circular_queue);
/*!
* @brief **双端队列**
* @tparam TData 数据项类型模板参数
*/
template<typename TData>
class DoubleEndedQueue {
public:
/*!
* @brief **构造函数**
* @param capacity 容量
* @note
* 构造函数
* -------
* -------
*
* -------
* capacity_使用参数capacity, front(队头索引)初始化为-1, rear(队尾索引)初始化为-1\n\n
* mem_data_分配内存\n
* **if** 内存分配失败 :\n
* &emsp; 抛出bad_alloc()\n
*
*
* -------
*/
DoubleEndedQueue(int capacity = 20) : capacity_(capacity), front_(-1), rear_(-1) {
this->mem_data_ = new TData[this->capacity_];
if (!this->mem_data_) {
throw bad_alloc();
}
}
/*!
* @brief **析构函数**
* @note
* 析构函数
* -------
* -------
*
* -------
* 释放mem_data_
*
*
* -------
*/
~DoubleEndedQueue() { delete[] this->mem_data_; }
// 队尾入队
bool PushBack(const TData& data);
// 队头入队
bool PushFront(const TData& data);
// 队头出队(保存数据)
bool PopFront(TData& data);
// 队头出队(不保存数据)
bool PopFront();
// 队尾出队(保存数据)
bool PopBack(TData& data);
// 队尾出队
bool PopBack();
// 获取队头数据
bool Front(TData& data) const;
// 获取队尾数据
bool Rear(TData& data) const;
// 判断是否空队
bool IsEmpty() const;
// 判断是否满队
bool IsFull() const;
// 获取长度
int Length() const;
// 清空队列
void Clear();
// 重载<<(打印队列)
friend ostream& operator<< <>(ostream& os, const DoubleEndedQueue<TData>& seq_queue);
private:
TData* mem_data_; //!< **元素数组**
int capacity_; //!< **容量**
int front_; //!< **队头索引**
int rear_; //!< **队尾索引**
};
/*!
* @brief **队尾入队**
* @tparam TData 数据项类型模板参数
* @param data 数据项值
* @return 执行结果
* @note
* 队尾入队
* -------
* -------
*
* -------
* + **1 合法性判断**\n\n
* **if** 容量已满 :\n
* &emsp; 返回false\n\n
* + **2 空队的特殊处理**\n\n
* **if** 空队 :\n
* &emsp; front_置为0\n\n
* + **3 入队操作**\n\n
* rear_值更新\n
* mem_data_[rear_]的值设为参数data\n\n
* + **4 退出函数**\n\n
* 返回true\n
*
*
* -------
*/
template<typename TData>
bool DoubleEndedQueue<TData>::PushBack(const TData& data) {
// ---------- 1 合法性判断 ----------
if (IsFull()) { // if 容量已满
return false; // 返回false
}
// ---------- 2 空队的特殊处理 ----------
if (Length() == 0) { // if 空队
this->front_ = 0; // front_置为0
}
// ---------- 3 入队操作 ----------
this->rear_ = (this->rear_ + 1 + this->capacity_) % this->capacity_; // rear_值更新
this->mem_data_[this->rear_] = data; // mem_data_[rear_]的值设为参数data
// ---------- 4 退出函数 ----------
return true; // 返回true
}
/*!
* @brief **队头入队**
* @tparam TData 数据项类型模板参数
* @param data 数据项值
* @return 执行结果
* @note
* 队头入队
* -------
* -------
*
* -------
* + **1 合法性判断**\n\n
* **if** 容量已满 :\n
* &emsp; 返回false\n\n
* + **2 空队的特殊处理**\n\n
* **if** 空队 :\n
* &emsp; rear_置为0\n\n
* + **3 入队操作**\n\n
* front_值更新\n
* mem_data_[front_]的值设为参数data\n\n
* + **4 退出函数**\n\n
* 返回true\n
*
*
* -------
*/
template<typename TData>
bool DoubleEndedQueue<TData>::PushFront(const TData& data) {
// ---------- 1 合法性判断 ----------
if (IsFull()) { // if 容量已满
return false; // 返回false
}
// ---------- 2 空队的特殊处理 ----------
if (Length() == 0) { // if 空队
this->rear_ = 0; // rear_置为0
}
// ---------- 3 入队操作 ----------
this->front_ = (this->front_ - 1 + this->capacity_) % this->capacity_; // front_值更新
this->mem_data_[this->front_] = data; // mem_data_[front_]的值设为参数data
// ---------- 4 退出函数 ----------
return true; // 返回true
}
/*!
* @brief **队头出队(保存数据)**
* @tparam TData 数据项类型模板参数
* @param data 数据项保存变量
* @return 执行结果
* @note
* 队头出队(保存数据)
* ---------------
* ---------------
*
* ---------------
* + **1 合法性判断**\n\n
* **if** 空队:\n
* &emsp; 返回false\n\n
* + **2 取队尾值和索引处理**\n\n
* mem_data_[front_]赋给参数data\n\n
* **if** 队列长度为1 :\n
* &emsp; front_置为-1\n
* &emsp; rear_置为-1\n
* **else**\n
* front_值更新\n\n
* + **3 退出函数**\n\n
* 返回true\n
*
*
* ---------------
*/
template<typename TData>
bool DoubleEndedQueue<TData>::PopFront(TData& data) {
// ---------- 1 合法性判断 ----------
if (IsEmpty()) { // if 空队
return false; // 返回false
}
// ---------- 2 取队尾值和索引处理 ----------
data = this->mem_data_[this->front_]; // mem_data_[front_]赋给参数data
if (Length() == 1) { // if 队列长度为1
this->front_ = -1; // front_置为-1
this->rear_ = -1; // rear_置为-1
} else {
front_ = (front_ + 1 + capacity_) % capacity_; // front_值更新
}
// ---------- 3 退出函数 ----------
return true; // 返回true
}
/*!
* @brief **队头出队**
* @tparam TData 数据项类型模板参数
* @return 执行结果
* @note
* 队头出队
* -------
* -------
*
* -------
* + **1 合法性判断**\n\n
* **if** 空队:\n
* &emsp; 返回false\n\n
* + **2 索引处理**\n\n
* **if** 队列长度为1 :\n
* &emsp; front_置为-1\n
* &emsp; rear_置为-1\n
* **else**\n
* front_值更新\n\n
* + **3 退出函数**\n\n
* 返回true\n
*
*
* ---------------
*/
template<typename TData>
bool DoubleEndedQueue<TData>::PopFront() {
// ---------- 1 合法性判断 ----------
if (IsEmpty()) { // if 空队
return false; // 返回false
}
// ---------- 2 长度为1的队列的特殊处理 ----------
if (Length() == 1) { // if 队列长度为1
this->front_ = -1; // front_置为-1
this->rear_ = -1; // rear_置为-1
} else {
front_ = (front_ + 1 + capacity_) % capacity_; // front_值更新
}
// ---------- 3 退出函数 ----------
return true; // 返回true
}
/*!
* @brief **队尾出队(保存数据)**
* @tparam TData 数据项类型模板参数
* @return 执行结果
* @note
* 队尾出队(保存数据)
* ---------------
* ---------------
*
* ---------------
* + **1 合法性判断**\n\n
* **if** 空队 :\n
* &emsp; 返回false\n\n
* + **2 取队尾值和索引处理**\n\n
* mem_data_[rear_]赋给参数data\n\n
* **if** 队列长度为1 :\n
* &emsp; front设置为-1\n
* &emsp; rear设置为-1\n
* **else**\n
* &emsp; rear_设置为(rear_ - 1 + capacity_) % capacity_\n\n
* + **3 退出函数**\n\n
* 返回true\n
*
*
* ---------------
*/
template<typename TData>
bool DoubleEndedQueue<TData>::PopBack(TData& data) {
// ---------- 1 合法性判断 ----------
if (IsEmpty()) { // if 空队
return false; // 返回false
}
// ---------- 2 索引处理 ----------
data = this->mem_data_[this->rear_]; // mem_data_[rear_]赋给参数data
if (Length() == 1) { // if 队列长度为1
this->front_ = -1; // front设为-1
this->rear_ = -1; // rear设为-1
} else {
rear_ = (rear_ - 1 + capacity_) % capacity_; // rear_设置为(rear_ - 1 + capacity_) % capacity_
}
// ---------- 3 退出函数 ----------
return true; // 返回true
}
/*!
* @brief **队尾出队**
* @tparam TData 数据项类型模板参数
* @return 执行结果
* @note
* 队尾出队
* -------
* -------
*
* -------
* + **1 合法性判断**\n\n
* **if** 空队 :\n
* &emsp; 返回false\n\n
* + **2 索引处理**\n\n
* **if** 队列长度为1 :\n
* &emsp; front设置为-1\n
* &emsp; rear设置为-1\n
* **else**\n
* &emsp; rear_设置为(rear_ - 1 + capacity_) % capacity_\n\n
* + **3 退出函数**\n\n
* 返回true\n
*
*
* -------
*/
template<typename TData>
bool DoubleEndedQueue<TData>::PopBack() {
// ---------- 1 合法性判断 ----------
if (IsEmpty()) { // if 空队
return false; // 返回false
}
// ---------- 2 索引处理 ----------
if (Length() == 1) { // if 队列长度为1
this->front_ = -1; // front设为-1
this->rear_ = -1; // rear设为-1
} else {
rear_ = (rear_ - 1 + capacity_) % capacity_; // rear_设置为(rear_ - 1 + capacity_) % capacity_
}
// ---------- 3 退出函数 ----------
return true; // 返回true
}
/*!
* @brief **获取队头数据**
* @tparam TData 数据项类型模板参数
* @param data 数据项保存变量
* @return 执行结果
* @note
* 获取队头数据
* ----------
* ----------
*
* ----------
* + **1 非法情况处理**\n\n
* **if** 空队 :\n
* &emsp; 返回false\n\n
* + **2 取队头数据**\n\n
* mem_data_[front_]赋给data\n\n
* + **3 退出函数**\n\n
* 返回false\n
*
*
* -------
*/
template<typename TData>
bool DoubleEndedQueue<TData>::Front(TData& data) const {
// ---------- 1 非法情况处理 ----------
if (IsEmpty()) { // if 空队
return false; // 返回false
}
// ---------- 2 取队头数据 ----------
data = this->mem_data_[front_]; // mem_data_[front_]赋给data
// ---------- 3 退出函数 ----------
return true; // 返回false
}
/*!
* @brief **获取队尾数据**
* @tparam TData 数据项类型模板参数
* @param data 数据项保存变量
* @return 执行结果
* @note
* 获取队尾数据
* ----------
* ----------
*
* ----------
* + **1 非法操作处理**\n\n
* **if** 空队 :\n
* &emsp; 返回false\n\n
* + **2 获取队尾数据**\n\n
* mem_data_[rear_]赋给参数data\n\n
* + **3 退出函数**\n\n
* 返回true\n
*
*
* -------
*/
template<typename TData>
bool DoubleEndedQueue<TData>::Rear(TData& data) const {
// ---------- 1 非法操作处理 ----------
if (IsEmpty()) { // if 空队
return false; // 返回false
}
// ---------- 2 获取队尾数据 ----------
data = this->mem_data_[rear_]; // mem_data_[rear_]赋给参数data
// ---------- 3 退出函数 ----------
return true; // 返回true
}
/*!
* @brief **判断是否为空**
* @tparam TData 数据项类型模板参数
* @return 是否为空
* @note
* 判断是否为空
* ----------
* ----------
*
* ----------
* 返回Length() == 0
*
*
* -------
*/
template<typename TData>
bool DoubleEndedQueue<TData>::IsEmpty() const {
return this->Length() == 0;
}
/*!
* @brief **判断队列是否为空**
* @tparam TData 数据项类型模板参数
* @return 是否为空
* @note
* 判断队列是否为空
* -------------
* -------------
*
* -------------
* 返回this->front_ == NULL
*
*
* -------
*/
template<typename TData>
bool DoubleEndedQueue<TData>::IsFull() const {
return this->Length() == capacity_;
}
/*!
* @brief **获取队列长度**
* @tparam TData 数据项类型模板参数
* @return 队列长度
* @note
* 获取队列长度
* ----------
* ----------
*
* ----------
* 初始化count(队列结点数量)为0\n\n
* **for loop** cur指向front_; cur != NULL; cur指向自身next :\n
* &emsp; count加1\n\n
* 返回count\n
*
*
* -------
*/
template<typename TData>
int DoubleEndedQueue<TData>::Length() const {
// ---------- 1 空队情况 ----------
if (this->rear_ == -1 && this->front_ == -1) { // if rear_和front_都为-1
return 0; // 返回0
}
// ---------- 2 非空队情况 ----------
return (rear_ - front_ + 1 + capacity_) % capacity_; // 返回(rear_ - front_ + 1 + capacity_) % capacity_
}
/*!
* @brief **清空**
* @tparam TData 数据项类型模板参数
* @note
* 清空
* ---
* ---
*
* ---
* rear_和front_都设为-1
*
*
* -------
*/
template<typename TData>
void DoubleEndedQueue<TData>::Clear() {
this->rear_ = -1;
this->front_ = -1;
}
/*!
* @brief **重载<&lt;**
* @tparam TData 数据项类型模板参数
* @param os 输出流
* @param circular_queue 循环队列
* @return 输出流(引用)
* @note
* 重载<<
* -----
* -----
*
* -----
* 打印队列长度\n\n
* **for loop** 遍历队列: \n
* &emsp; 获取当前结点的数组索引\n
* &emsp; 打印当前结点的数据项\n\n
* 返回os\n
*
*
* -------
*/
template<typename TData>
ostream& operator<<(ostream& os, const DoubleEndedQueue<TData>& circular_queue) {
os << "The size of link queue: " << circular_queue.Length() << endl; // 打印队列长度
for (int i = 0; i < circular_queue.Length(); i++) { // for loop 遍历队列
int actual_index = (circular_queue.front_ + i + circular_queue.capacity_) % circular_queue.capacity_; // 获取当前结点的数组索引
os << circular_queue.mem_data_[actual_index] << endl; // 打印当前结点数据项
}
return os; // 返回os
}
#endif // CYBER_DASH_DOUBLE_ENDED_QUEUE_H
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/yuanermm/data-structures-cpp.git
git@gitee.com:yuanermm/data-structures-cpp.git
yuanermm
data-structures-cpp
数据结构(C++模板实现)
master

搜索帮助