news 2026/4/23 13:42:51

C++实现数据结构——队列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++实现数据结构——队列

这里只讨论队列的链式实现,即链式队列(Linked Queue)

基本概念

链式队列是一种基于链表实现的队列数据结构,它使用链表节点来存储数据元素,并通过指针连接这些节点来形成队列结构。与顺序队列(数组实现)相比,链式队列的主要特点是不需要预先分配固定大小的存储空间,可以动态地增长和缩减。

结构组成

链式队列通常由以下两个部分组成:

队首指针(front):指向队列的第一个元素(即将被移除的元素) 队尾指针(rear):指向队列的最后一个元素(最新添加的元素)

每个节点包含:

数据域:存储实际的数据 指针域:指向下一个节点的指针

优缺点分析

优点:

动态大小:不需要预先指定队列大小,可以动态增长 无空间浪费:不会出现顺序队列中的"假溢出"问题 内存利用率高:只在使用时分配内存

缺点:

每个节点需要额外的指针空间 操作稍慢:需要动态内存分配和释放 内存不连续:可能导致缓存不友好

应用场景

链式队列适合以下情况:

无法预估队列最大长度的场景 内存碎片化严重的环境 需要频繁插入删除且队列大小变化大的场合

例如:

操作系统中的进程调度队列 网络数据包缓冲队列 打印机任务队列

时间复杂度分析
操作 时间复杂度
入队 O(1)
出队 O(1)
检查空 O(1)
变体与扩展

双向链式队列:可以在两端进行插入和删除操作 优先队列:结合优先级的链式队列实现 循环链式队列:最后一个节点指向第一个节点,形成循环

实现注意事项

内存管理:确保正确释放出队节点的内存 边界条件:特别注意空队列和只有一个元素的情况 线程安全:在多线程环境中使用时需要添加同步机制

LinkedQueue.cpp实现

#include <iostream> #include <stdexcept> // For std::underflow_error template <typename T> class Node { public: T value; Node* next; Node(T val) : value(val), next(nullptr) {} }; template <typename T> class Queue { private: Node<T>* front; // 指向队列首部的指针 Node<T>* rear; // 指向队列尾部的指针 int count; // 队列中的元素数量 public: Queue() : front(nullptr), rear(nullptr), count(0) {} ~Queue() { clear(); } // 析构函数,释放所有节点内存 void push(const T& value) { // 在队尾添加元素 Node<T>* newNode = new Node<T>(value); if (rear == nullptr) { // 如果队列为空,则新节点既是头部也是尾部 front = rear = newNode; } else { // 如果队列不为空,将新节点添加到尾部,并更新尾部指针 rear->next = newNode; rear = newNode; } count++; // 增加计数器 } void pop() { // 从队首移除元素,如果队列为空则抛出异常 if (empty()) throw std::underflow_error("Queue is empty"); // 检查队列是否为空并抛出异常(可选) Node<T>* temp = front; // 保存当前队首节点的指针以便释放内存 front = front->next; // 更新队首指针到下一个节点 if (front == nullptr) rear = nullptr; // 如果队列变为空,更新尾部指针为nullptr delete temp; // 释放原队首节点的内存 count--; // 减少计数器 } T& front() { // 获取队首元素但不移除(引用返回) if (empty()) throw std::underflow_error("Queue is empty"); // 检查队列是否为空并抛出异常(可选) return front->value; // 返回队首节点的值引用(注意:不检查是否为nullptr,因为已经在pop中做了检查) } bool empty() const { return count == 0; } // 检查队列是否为空 int size() const { return count; } // 获取队列的大小(元素数量) void clear() { // 清空队列,释放所有节点内存(可选) while (!empty()) { pop(); } // 清空队列直到为空,释放所有节点内存(可选) } };

main.cpp测试

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:35:46

LobeChat能否用于编写Dockerfile?容器化配置生成

LobeChat能否用于编写Dockerfile&#xff1f;容器化配置生成 在现代AI应用开发中&#xff0c;一个看似简单却极具启发性的问题正在浮现&#xff1a;我们能否让一个AI聊天界面——比如LobeChat——来帮我们写它自己的部署脚本&#xff1f;这听起来像某种“自我指涉”的技术玩笑&…

作者头像 李华
网站建设 2026/4/22 15:52:36

LobeChat能否实现数学公式求解?STEM学科辅导工具

LobeChat能否实现数学公式求解&#xff1f;STEM学科辅导工具 在今天的AI教育浪潮中&#xff0c;一个现实问题正日益凸显&#xff1a;学生面对复杂的微积分题或物理方程时&#xff0c;往往卡在“下一步怎么推导”上。传统搜索引擎只能返回静态答案&#xff0c;而通用聊天机器人又…

作者头像 李华
网站建设 2026/4/23 11:18:49

HunyuanVideo-Foley部署:本地与云端GPU加速全解析

HunyuanVideo-Foley部署&#xff1a;本地与云端GPU加速全解析 你有没有过这样的体验&#xff1f;剪辑了一条十分钟的Vlog&#xff0c;画面精致、运镜流畅&#xff0c;可一到音效环节就卡壳了——脚步声不对节奏&#xff0c;关门声像塑料盒碰撞&#xff0c;背景音乐还抢戏……最…

作者头像 李华
网站建设 2026/4/23 11:18:53

LobeChat能否制定预算?家庭财务管理助手

LobeChat能否制定预算&#xff1f;家庭财务管理助手 在智能家居设备日益复杂的今天&#xff0c;确保无线连接的稳定性已成为一大设计挑战。而将这一思路迁移到数字生活管理领域&#xff0c;我们发现&#xff1a;现代家庭面临的不是信息太少&#xff0c;而是工具太多、操作太碎、…

作者头像 李华
网站建设 2026/4/23 11:30:18

pt-table-checksum MySQL主从数据一致性校验工具工作原理及使用限制介绍

本篇文章将详细介绍 pt-table-checksum 这款用于MySQL主从数据一致性校验的工具。以下是其核心要点总结&#xff1a; &#x1f527; 工具简介 pt-table-checksum 是 Percona Toolkit 工具包中的一个重要工具&#xff0c;专门用于校验MySQL主库和从库之间的数据是否一致。其基…

作者头像 李华
网站建设 2026/4/23 11:19:18

NVIDIA TensorRT-LLM:大模型推理性能优化指南

NVIDIA TensorRT-LLM&#xff1a;大模型推理性能优化指南 在当前 AI 应用飞速发展的背景下&#xff0c;大语言模型&#xff08;LLMs&#xff09;正从实验室走向真实业务场景——无论是智能客服、代码助手&#xff0c;还是企业级知识问答系统&#xff0c;对低延迟、高吞吐的推理…

作者头像 李华