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日

相关文章

  • Python时间序列处理之ARIMA模型的使用讲解

    Python时间序列处理之ARIMA模型的使用讲解 本文主要介绍如何使用Python进行时间序列的ARIMA模型处理。ARIMA模型是一种常用的时间序列分析方法,可用于对未来时间序列的预测。本文将详细讲解ARIMA模型的原理和应用,以及如何使用Python完成ARIMA模型的建模和预测。 1. ARIMA模型简介 1.1 模型原理 ARIMA模型是基于时间序…

    C 2023年5月22日
    00
  • 45W pd电源到底怎么样?小米45W USB-C电源测评

    45W PD电源的介绍 45W PD电源是一种高功率输出的USB-C电源,可以为充电功率需求较高的设备提供更快的充电速度,如大型笔记本电脑、平板电脑和智能手机等。小米45W USB-C电源是目前市面上最受欢迎的45W PD电源之一。 电源性能测试 为了测试小米45W USB-C电源的性能表现,我们进行了以下测试: 确定输出功率 首先,我们测试了电源提供的最大…

    C 2023年5月23日
    00
  • C语言文件操作零基础新手入门保姆级教程

    C语言文件操作零基础新手入门保姆级教程 文件操作概述 文件操作是指对文件进行读写、复制、移动、重命名等操作的过程。C语言中提供了丰富的文件操作函数,使得开发者可以轻松地实现文件的操作。 C语言文件操作的基本流程为: 打开文件 进行读/写操作 关闭文件 文件操作函数 打开文件 fopen()函数用于打开文件,函数定义如下: FILE *fopen(const …

    C 2023年5月23日
    00
  • Qt写入Json文件的方法详解(含源码+注释)

    下面我就为您详细讲解一下“Qt写入Json文件的方法详解(含源码+注释)”这篇文章。 一、前言 本文主要介绍Qt中如何使用QJsonDocument来进行Json的操作,其中包括Json文件的读取、写入及解析等操作。该文档由以下几个部分构成: Json的基础知识——介绍了Json的基础知识和理解 Qt中Json的API使用——介绍了整个Qt中Json相关AP…

    C 2023年5月23日
    00
  • C语言指针的图文详解

    C语言指针的图文详解 什么是指针 在C语言中,指针是一种特殊的数据类型,它存储的是一个内存地址,该内存地址指向存储在内存中的另外一个变量的值。可以将指针看作一种工具,它可以用来操作内存中的数据,让程序更加灵活和高效。 如何声明指针 在C语言中声明指针需要使用星号(*)符号。例如,下面的代码定义了一个名为“ptr”的指向整数变量的指针: int *ptr; 上…

    C 2023年5月22日
    00
  • 如何判断一个整数的二进制中有多少个1

    要判断一个整数的二进制中有多少个1,可以采用以下两种方法: 方法一:遍历每一位对于二进制数字,可以通过不断取模和除法,得到每一位的数字,然后判断当前位是否为1。具体步骤如下: 定义一个计数器counts,用于记录1的个数 对于整数num,不断进行模2运算,得到二进制数中当前位的数字,记为temp 如果temp为1,则counts加1 对num进行除2运算,向…

    C 2023年5月23日
    00
  • 详解Matlab如何绘制圆角半透明图例

    如何绘制圆角半透明图例 在MATLAB中,我们可以使用legend函数来添加图例到绘图中。该函数允许设置图例框的不透明度,但默认情况下没有提供设置圆角的选项。但是,我们可以通过一些技巧来实现绘制圆角半透明图例。 以下是绘制圆角半透明图例的详细攻略: 设置图例不透明度 首先,我们可以通过设置图例的Alpha不透明度选项来使其变为半透明。以下代码演示如何使用Al…

    C 2023年5月23日
    00
  • Java中的StackOverflowError错误问题及解决方法

    Java中的StackOverflowError错误问题及解决方法 在Java开发中,如果递归调用方法过多,可能会导致StackOverflowError错误。本文将详细介绍如何识别该错误以及如何解决该问题。 StackOverflowError错误 当调用堆栈的大小超过JVM允许的最大深度时,就会发生StackOverflowError错误,即递归调用过于…

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