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语言实现学生管理系统总结 本文将介绍使用C语言实现学生管理系统的完整攻略。学生管理系统是一个常见的管理系统的应用之一。通过它,我们可以对学生的信息进行管理和查询,提高管理效率。下面将详细介绍如何使用C语言实现学生管理系统。 1.需求分析 在开始实现学生管理系统之前,我们需要进行需求分析,明确系统的功能和需求。下面是该系统需要完成的功能和需求: 添加学生信息…

    C 2023年5月23日
    00
  • [c++]变量声明与定义的规则详解

    下面我将为您详细讲解“[c++]变量声明与定义的规则详解”的完整攻略。 变量声明与定义的介绍 在程序中,变量可以被声明和定义。声明告诉编译器一个变量的名称和类型,而定义会分配内存并可能会为变量赋值。在C++中,变量的声明和定义的规则是相当灵活的,但需要遵循一些基本规则。 变量声明的规则 声明变量 在使用变量之前,我们需要先声明它们。声明变量只会告诉编译器变量…

    C 2023年5月22日
    00
  • linux多线程编程(四)

    Linux多线程编程(四)攻略 前言 本文将讲解在Linux环境下进行多线程编程的基本概念、操作方法和注意事项,通过示例代码演示实现多线程的一些常见用法。 基础知识 线程的创建和销毁 线程是轻量级的进程,一个进程可以包含多个线程。线程的创建和销毁都是通过pthread库中的函数来完成的: #include <pthread.h> int pthr…

    C 2023年5月22日
    00
  • VS2019中CMake项目如何指定c++语言标准

    对于VS2019中的CMake项目,指定C++语言标准分为以下两种情况: 针对某个特定的C++源文件指定语言标准 针对整个项目指定C++语言标准 以下是详细的操作步骤: 针对某个特定的C++源文件指定语言标准: (1) 在该C++源文件中添加以下语句: #SET(CMAKE_CXX_STANDARD 17) 以上语句的含义就是将这个C++源文件设为使用C++…

    C 2023年5月23日
    00
  • c语言全盘搜索指定文件的实例代码

    C语言全盘搜索指定文件的实例代码攻略 确定需求 在代码编写之前,我们需要明确需要完成的功能和要求。此次编写的代码需要能够进行全盘搜索指定文件,并输出文件的路径信息。 确定实现方式 具体实现方式可以使用递归算法来实现。步骤如下: 在指定的目录下,搜索该文件或文件夹; 若搜到的是文件夹,则递归执行搜索该文件或文件夹; 若搜到的是文件,则输出输出文件路径信息。 确…

    C 2023年5月24日
    00
  • C语言返回动态分配内存的地址

    C语言中,返回动态分配内存的地址通常使用指针类型函数实现。在这种情况下,C语言程序需要使用malloc()等函数手动分配内存,并返回指向分配内存空间的指针。以下是如何返回动态分配内存的地址的完整使用攻略。 步骤1:使用malloc()函数分配内存空间 在C语言中,使用malloc()函数可以手动分配内存空间。该函数需要一个整数作为参数,指定需要分配的内存空间…

    C 2023年5月9日
    00
  • Node.js处理I/O数据之使用Buffer模块缓冲数据

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它能够在服务器端解析 JavaScript代码,同时具有高效的I/O操作能力。其中,Buffer模块是Node.js核心库中处理二进制数据的工具之一。我们可以使用Buffer模块来创建缓冲区,对数据进行读写操作。 创建Buffer 我们可以使用以下方法来创建Buffer实例: co…

    C 2023年5月23日
    00
  • C++11的for循环,以及范围Range类的简单实现

    C++11的for循环和范围(Range)类是在C++11标准中引入的新特性。C++11的for循环允许我们使用更加简洁的语法来遍历数组、容器、等其他可迭代的对象,而范围(Range)类则提供了一种更加直观、可读性更好的方法来表示一个对象的范围。 C++11的for循环 使用C++11的for循环,可以通过以下简洁的语法来遍历数组: int arr[] = …

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