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++中的RAII机制详解

    C++中的RAII机制详解 什么是RAII RAII是一种资源获取即初始化的技术,它能够确保在使用完资源后,自动释放资源。RAII在C++中是一种很常见的技术,可以被用于管理内存、文件句柄、互斥锁等各种资源。 RAII的实现方式 RAII的实现方式是通过C++的构造函数和析构函数来实现的。C++中的构造函数用于初始化对象的内部状态,而析构函数则在对象被销毁时…

    C 2023年5月22日
    00
  • C语言版学生信息管理系统

    下面是详细讲解C语言版学生信息管理系统的完整攻略。 环境配置 安装gcc编译器。在Linux或MacOS下,gcc编译器通常已经预装;在Windows下,需要下载并安装MinGW。 编写和运行C程序需要一个编辑器和终端,建议使用集成开发环境(IDE)。推荐使用Code::Blocks或Visual Studio Code。 数据存储 C语言版学生信息管理系统…

    C 2023年5月23日
    00
  • C++成员函数如何当作回调函数同时传递this指针

    要将一个C++对象的成员函数作为回调函数并传递对象的this指针,需要使用函数对象和函数指针的技巧。下面分步骤介绍: 1. 定义函数对象 首先定义一个函数对象类,这个类中定义了一个成员函数指针和一个指向对象的指针。这个类将被用于封装成员函数以便传递给其他函数。 class Foo { public: typedef void (Foo::*Callback)…

    C 2023年5月23日
    00
  • VScode中C++头文件问题的终极解决方法详析

    下面是详细的攻略: VScode中C++头文件问题的终极解决方法详析 在使用VScode进行C++程序开发时,遇到头文件引用问题是非常常见的。本文将为大家介绍,在VScode中C++头文件问题的终极解决方法,以确保你在开发过程中能够顺畅地引用和编译代码。具体解决方法如下: 第一步:配置includePath 在VScode中,需要配置includePath,…

    C 2023年5月23日
    00
  • win10打开c/d/e/f盘符很慢提示现正在处理它该怎么解决?

    Win10打开磁盘慢的解决方法 出现此问题后,是因为Win10系统正在检测并优化磁盘的性能,过程需要一定的时间。但在某些情况下,这个过程会超时,导致磁盘打开慢,以下是两种解决方法。 方法一:禁用磁盘预读取功能 Win10系统默认启用了磁盘预读取功能,这个功能会将一些磁盘里的数据预读取到内存,以加快下一次打开磁盘时的速度。但是,如果磁盘内存数据过大,预读取功能…

    C 2023年5月23日
    00
  • C++实现校园导游系统

    C++实现校园导游系统攻略 系统概述 本系统利用C++实现了校园导游的功能,用户可以在系统中选择要参观的景点,并得到相关的信息如景点介绍、地址、开放时间等。同时,用户还可以在地图上查看各个景点的位置和路线,方便用户进行导览。 功能模块 本系统主要分为以下模块: 景点数据读入模块,用于从文件中将景点信息读入内存。 景点信息显示模块,用于在控制台上显示景点信息。…

    C 2023年5月23日
    00
  • Java的Jackson库的使用及其树模型的入门学习教程

    Java的Jackson库的使用及其树模型的入门学习教程 什么是Jackson库 Jackson是一个在Java平台上解析JSON的框架,它是一个高性能的开源库,同时还具有灵活而强大的功能,可以方便地将Java对象序列化为JSON格式的数据,或者将JSON数据反序列化为Java对象。 Jackson库的基本使用 Jackson库的基本使用分为序列化和反序列化…

    C 2023年5月23日
    00
  • 谈谈RxJava2中的异常及处理方法

    针对“谈谈RxJava2中的异常及处理方法”的问题,我可以提供以下完整攻略。 异常类型 在RxJava2中,一般有以下三种异常类型: Checked异常:如 IOException,必须使用 try/catch 块进行处理。 RuntimeException:如 NullPointerException,需要程序员的代码改进避免出现此类异常。此类异常也可以被…

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