C++代码实现链队列详解

C++代码实现链队列详解

什么是链队列?

链队列是一种基于链表实现的队列,它克服了顺序队列需要进行元素搬移的缺点,具有入队和出队均可以在O(1)时间内完成的优点。

链队列的数据结构

链队列的数据结构主要由节点结构体和队列结构体两部分组成。

节点结构体

节点结构体主要包括当前节点存储的数据和指向下一个节点的指针。

template <typename T>
struct Node{
    T data;
    Node<T>* next;
};

队列结构体

队列结构体主要包括队头和队尾节点以及队列中元素的数量。因为队列中只能从队尾插入元素,从队头删除元素,所以队头和队尾是比较重要的。

template <typename T>
struct Queue{
    Node<T>* front;
    Node<T>* rear;
    int size;
};

链队列的操作

链队列主要包括以下几个操作:入队、出队、判断队列是否为空、获取队列元素个数、打印队列元素。

入队操作

链队列入队操作实质上就是在队尾插入一个新节点,然后更新队列的rear指针和size大小。

template <typename T>
void enqueue(Queue<T>* q, T value){
    Node<T>* p = new Node<T>;
    p->data = value;
    p->next = nullptr;
    if (q->front == nullptr){
        q->front = q->rear = p;
    } else {
        q->rear->next = p;
        q->rear = p;
    }
    q->size++;
}

出队操作

链队列出队操作实质上就是删除队头节点,然后更新队列的front指针和size大小,并返回队头节点的值。

template <typename T>
T dequeue(Queue<T>* q){
    if (q->front == nullptr){
        throw "queue is empty";
    }
    Node<T>* p = q->front;
    T ret = p->data;
    q->front = p->next;
    if (q->front == nullptr){
        q->rear = nullptr;
    }
    delete p;
    q->size--;
    return ret;
}

判断队列是否为空操作

判断队列是否为空操作主要判断队列的front指针是否为空。

template <typename T>
bool is_empty(Queue<T>* q){
    return (q->front == nullptr);
}

获取队列元素个数操作

获取队列元素个数操作主要返回队列的size大小。

template <typename T>
int length(Queue<T>* q){
    return q->size;
}

打印队列元素操作

打印队列元素操作主要遍历队列中所有节点,然后输出节点中存储的数据。

template <typename T>
void print(Queue<T>* q){
    Node<T>* p = q->front;
    while (p != nullptr){
        std::cout << p->data << " ";
        p = p->next;
    }
    std::cout << std::endl;
}

链队列的示例说明

示例一

Queue<int>* q = new Queue<int>{nullptr, nullptr, 0};
enqueue(q, 1);
enqueue(q, 2);
enqueue(q, 3);
print(q);  // output: 1 2 3
std::cout << length(q) << std::endl;  // output: 3
std::cout << is_empty(q) << std::endl;  // output: 0
std::cout << dequeue(q) << std::endl;  // output: 1
print(q);  // output: 2 3
delete q;

示例二

Queue<std::string>* q = new Queue<std::string>{nullptr, nullptr, 0};
enqueue(q, "hello");
enqueue(q, "world");
enqueue(q, "!");
print(q);  // output: hello world !
std::cout << length(q) << std::endl;  // output: 3
std::cout << is_empty(q) << std::endl;  // output: 0
std::cout << dequeue(q) << std::endl;  // output: hello
print(q);  // output: world !
delete q;

总结

本文详细讲解了链队列的概念、数据结构和操作,并给出了代码实现和两个示例。希望读者可以通过本文更好地理解链队列的实现方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++代码实现链队列详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C++抽奖程序实现方法

    下面是 C++ 抽奖程序的实现方法完整攻略,包括以下步骤: 1. 设计程序功能 在开始编写代码之前,我们需要先明确程序需要实现的功能,即实现一个简单的抽奖程序,需要包括以下特点: 参与抽奖的人员名单事先固定,即不允许现场填写名字等信息; 程序需要在全部人员名单中随机抽取若干名中奖者; 抽奖过程需要进行多次,每次抽奖结果不重复; 可以在控制台中显示每次抽奖的结…

    C 2023年5月23日
    00
  • 深入理解C语言指针

    深入理解C语言指针 指针的概念 指针是C语言中一种非常重要的数据类型,指针可以指向任何一个内存地址中存储的数据。指针通常用于动态存储分配和传递参数。当我们需要动态分配内存空间时,可以通过指针来实现;当我们需要传递大量数据时,使用指针可以减少内存使用量,提高程序效率。 指针变量的定义和初始化 在C语言中,指针变量是一种存储指针地址的变量。定义指针变量的一般形式…

    C 2023年5月23日
    00
  • C语言实现学生管理系统的源码分享

    C语言实现学生管理系统的源码分享攻略 1. 确定需求及功能设计 首先要确定学生管理系统的需求和功能,例如添加学生信息、删除学生信息、查询学生信息、更新学生信息等功能,然后进行功能及界面的设计。 2. 编写代码 在得到需求及功能设计后,就可以开始编写代码了。可以用C语言或C++语言编写学生管理系统的源码,编程编辑器一般可以选择gcc或VS Code等。 代码示…

    C 2023年5月23日
    00
  • Json转换工具类

    下面我将详细讲解“Json转换工具类”的完整攻略,希望对您有所帮助。 1. 什么是Json转换工具类? Json转换工具类是一种可重用的代码工具,旨在使Java开发人员能够更轻松地将对象转换为Json格式,或者将Json格式转换为Java对象。 2. 如何使用Json转换工具类? 有很多Json转换工具类可供选择,比如: Jackson Gson FastJ…

    C 2023年5月23日
    00
  • C语言用realloc调整数组长度

    下面是关于C语言中使用realloc调整数组长度的详细攻略: 1. realloc函数的介绍 在C语言中,realloc函数用于在运行时重新分配之前已经分配了内存的内存块的大小。这个函数返回一个指向新分配内存的指针。如果没有足够的内存,realloc函数的返回值为NULL。realloc函数的语法如下: ptr = realloc(ptr, size); 其…

    C 2023年5月10日
    00
  • C语言实现简易版扫雷的完整过程

    C语言实现简易版扫雷完整攻略 1. 确定项目需求 在开始开发C语言的简易版扫雷游戏之前,我们需要明确游戏的需求,包括: 游戏界面布局 雷区的生成 点击格子的处理 游戏结束的判断 2. 设计游戏界面 我们可以使用命令行界面来实现扫雷游戏的显示,使用字符来表示不同的状态,包括: 未翻开的格子 已翻开的格子 标记为雷的格子 标记为问号的格子 3. 生成雷区 我们可…

    C 2023年5月23日
    00
  • C语言全排列回溯算法介绍

    C语言全排列回溯算法介绍 前言 全排列回溯算法是一种经典的组合问题解法。本文将介绍使用C语言实现全排列回溯算法的完整攻略。全排列指将有限个不同元素按照各种排列方式进行组合,形成所有可能的排列组合。如对于三个元素 {1, 2, 3},所有不同的排列组合为 123、132、213、231、312、321。 算法思路 全排列回溯算法的思路如下: 第一步,选定一个起…

    C 2023年5月23日
    00
  • C++实现哈夫曼树算法

    C++实现哈夫曼树算法攻略 哈夫曼树,又称最优二叉树,是一种带权路径长度最短的二叉树。它常用于数据压缩和编码的算法中。 1. 哈夫曼树的定义 哈夫曼树是一种满足以下属性的二叉树: 树中每个叶子节点都对应一个权值; 树中每个非叶子节点的权值是其左右子树中权值之和; 树的带权路径长度最小。 2. 哈夫曼编码的实现 哈夫曼编码是一种前缀编码,它把每个不同符号对应到…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部