顺序循环队列和链队列的C/C++语言描述实现模板

前言

数据结构中顺序循环队列和链队列的C/C++语言描述实现模板,有详细的步骤解析及使用示例。


代码仓库


sqQueue.cpp(顺序循环队列)

//头文件————————————————————
#include <iostream>

//命名空间————————————————————
using namespace std;

//宏————————————————————
#define MaxSize 100 //队列的最大大小

//自定义数据类型————————————————————
typedef int ElemType; //数据的(数据)类型 依据数据的实际类型定义

//结构体
//顺序循环队列
typedef struct SqQueue
{
    ElemType data[MaxSize]; //数据
    int front;              //队头指针  定义为指向队头元素位置  出队:先出后移
    int rear;               //队尾指针  定义为指向队尾元素位置的下一个位置  入队:先入后移
} SqQueue;

//函数声明————————————————————
void use_example();                             //使用示例
void init(SqQueue &sqQueue);                    //初始化
bool enQueue(SqQueue &sqQueue, ElemType elem);  //入队
bool deQueue(SqQueue &sqQueue, ElemType &elem); //出队

//主函数————————————————————
int main()
{
    use_example(); //使用示例

    return 0;
}

//函数定义————————————————————
//使用示例
void use_example()
{
    //创建
    SqQueue sqQueue;

    //初始化
    init(sqQueue);
    cout << sqQueue.front << endl; //输出:0
    cout << sqQueue.rear << endl;  //输出:0

    //入队
    ElemType elem1 = 100;
    ElemType elem2 = 200;
    ElemType elem3 = 300;

    enQueue(sqQueue, elem1);
    enQueue(sqQueue, elem2);
    enQueue(sqQueue, elem3); //元素在栈中的排列:100,200,300

    //出队
    ElemType elem4 = 0;
    ElemType elem5 = 0;

    deQueue(sqQueue, elem4);
    deQueue(sqQueue, elem5);

    cout << elem4 << endl; //输出:100
    cout << elem5 << endl; //输出:200

    return;
}

//初始化
void init(SqQueue &sqQueue) //参数:队列
{
    //定义队头指针和队尾指针指向索引/位置0为队空
    sqQueue.front = 0;
    sqQueue.rear = 0;
}

//入队
//时间复杂度:O(1)
bool enQueue(SqQueue &sqQueue, ElemType elem) //参数:队列,元素
{
    if ((sqQueue.rear + 1) % MaxSize == sqQueue.front) //队满
    {
        return false;
    }

    sqQueue.data[sqQueue.rear] = elem;           //元素入队
    sqQueue.rear = (sqQueue.rear + 1) % MaxSize; //队尾指针循环+1

    return true;
}

//出队
//时间复杂度:O(1)
bool deQueue(SqQueue &sqQueue, ElemType &elem) //参数:队列,元素
{
    if (sqQueue.front == sqQueue.rear) //队空
    {
        return false;
    }

    elem = sqQueue.data[sqQueue.front];            //获取、保存元素
    sqQueue.front = (sqQueue.front + 1) % MaxSize; //队头指针循环+1   元素出队

    return true;
}

linkQueue.cpp(链队列)

//头文件————————————————————
#include <iostream>

//命名空间————————————————————
using namespace std;

//自定义数据类型————————————————————
typedef int ElemType; //数据的(数据)类型 依据数据的实际类型定义

//结构体
//链队列结点
typedef struct LinkNode
{
    ElemType data;         //数据
    struct LinkNode *next; //指针
} LinkNode;

//链队列
//因为需要保存两个结点指针,所以新定义结构体封装
typedef struct LinkQueue
{
    LinkNode *front; //队头结点指针
    LinkNode *rear;  //队尾结点指针
} LinkQueue;

//函数声明————————————————————
void use_example();                                 //使用示例
void init(LinkQueue &linkQueue);                    //初始化
void enQueue(LinkQueue &linkQueue, ElemType elem);  //入队
bool deQueue(LinkQueue &linkQueue, ElemType &elem); //出队

//主函数————————————————————
int main()
{
    use_example(); //使用示例

    return 0;
}

//函数定义————————————————————
//使用示例
void use_example()
{
    //创建
    LinkQueue linkQueue; //队列

    //初始化
    init(linkQueue);

    //入队
    ElemType elem1 = 100;
    ElemType elem2 = 200;
    ElemType elem3 = 300;

    enQueue(linkQueue, elem1);
    enQueue(linkQueue, elem2);
    enQueue(linkQueue, elem3); //元素在栈中的排列:100,200,300

    //出队
    ElemType elem4 = 0;
    ElemType elem5 = 0;

    deQueue(linkQueue, elem4);
    deQueue(linkQueue, elem5);

    cout << elem4 << endl; //输出:100
    cout << elem5 << endl; //输出:200

    return;
}

//初始化
void init(LinkQueue &linkQueue) //参数:队列
{
    linkQueue.front = linkQueue.rear = (LinkNode *)malloc(sizeof(LinkNode)); //创建头结点   队列的队头、尾结点指针指向头结点
    linkQueue.front->next = nullptr;                                         //头结点的指针指向空   即:linkQueue.rear->next = nullptr;
}

//入队
//时间复杂度:O(1)
void enQueue(LinkQueue &linkQueue, ElemType elem) //参数:队列,元素
{
    LinkNode *newNode; //新结点指针

    newNode = (LinkNode *)malloc(sizeof(LinkNode)); //创建新结点

    newNode->data = elem; //初始化新结点的数据

    //入队
    linkQueue.rear->next = newNode;
    linkQueue.rear = newNode;
}

//出栈
//时间复杂度:O(1)
bool deQueue(LinkQueue &linkQueue, ElemType &elem) //参数:队列,元素
{
    if (linkQueue.front == linkQueue.rear) //队空
    {
        return false;
    }

    LinkNode *tempNode = nullptr; //临时结点指针

    elem = linkQueue.front->next->data; //获取、保存数据

    //出队
    tempNode = linkQueue.front->next;
    linkQueue.front->next = tempNode->next;

    //易漏边界条件:如果除头结点只剩一个元素,该元素出队后,将队尾结点指针指向队头指针指向的头结点
    if (linkQueue.rear == tempNode)
    {
        linkQueue.rear = linkQueue.front;
    }

    free(tempNode); //释放结点空间

    return true;
}

总结

不同参考资料中,顺序循环队列和链队列的描述实现各不相同,但基本思想是一致的。作者使用规范的变量命名、提供详细的步骤解析及使用示例,应用C/C++语言将其整合成模板,以帮助理解记忆。


参考资料

  • 《2023版数据结构高分笔记》主编:率辉
  • 《2023年计算机组成原理考研复习指导》组编:王道论坛
  • 《大话数据结构》作者:程杰

作者的话

  • 感谢参考资料的作者/博主
  • 作者:夜悊
  • 版权所有,转载请注明出处,谢谢~
  • 如果文章对你有帮助,请点个赞或加个粉丝吧,你的支持就是作者的动力~
  • 文章在描述时有疑惑的地方,请留言,定会一一耐心讨论、解答
  • 文章在认识上有错误的地方, 敬请批评指正
  • 望读者们都能有所收获

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值