当前位置: 首页 > news >正文

c++相关的数据结构

单链表,模板加智能指针 

#include <iostream>
#include <memory>// 定义链表节点结构
template <typename T>
struct Node {T data;std::shared_ptr<Node<T>> next;Node(const T& value) : data(value), next(nullptr) {}
};// 定义链表类
template <typename T>
class LinkedList {
private:std::shared_ptr<Node<T>> head;public:LinkedList() : head(nullptr) {}// 在链表末尾插入节点void insert(const T& value) {std::shared_ptr<Node<T>> newNode = std::make_shared<Node<T>>(value);if (head == nullptr) {head = newNode;} else {std::shared_ptr<Node<T>> temp = head;while (temp->next != nullptr) {temp = temp->next;}temp->next = newNode;}}// 打印链表元素void print() {std::shared_ptr<Node<T>> temp = head;while (temp != nullptr) {std::cout << temp->data << " ";temp = temp->next;}std::cout << std::endl;}
};int main() {LinkedList<int> list;list.insert(1);list.insert(2);list.insert(3);list.insert(4);list.print(); // 输出: 1 2 3 4return 0;
}

单链表加完美转发进阶版

#include <iostream>
#include <memory>
#include <utility>template <typename T>
class LinkedList {
private:struct Node {T data;std::shared_ptr<Node> next;Node(const T& value) : data(value), next(nullptr) {}};std::shared_ptr<Node> head;public:LinkedList() : head(nullptr) {}//头插法template <typename U>void insert(U&& data) {std::shared_ptr<Node> newNode = std::make_shared<Node>(std::forward<U>(data));newNode->next = head;head = newNode;}void print() const {std::shared_ptr<Node> current = head;while (current != nullptr) {std::cout << current->data << " ";current = current->next;}std::cout << std::endl;}
};int main() {LinkedList<int> list;list.insert(3);list.insert(5);list.insert(7);list.print();  // 输出链表内容: 7 5 3return 0;
}

双链表  

#include <iostream>
#include <memory>// 定义链表节点结构
template <typename T>
struct Node {T data;std::shared_ptr<Node<T>> prev;std::shared_ptr<Node<T>> next;Node(const T& value) : data(value), prev(nullptr), next(nullptr) {}
};// 定义链表类
template <typename T>
class DoublyLinkedList {
private:std::shared_ptr<Node<T>> head;std::shared_ptr<Node<T>> tail;public:DoublyLinkedList() : head(nullptr), tail(nullptr) {}// 在链表末尾插入节点void insert(const T& value) {std::shared_ptr<Node<T>> newNode = std::make_shared<Node<T>>(value);if (head == nullptr) {head = newNode;tail = newNode;}else {tail->next = newNode;newNode->prev = tail;tail = newNode;}}// 打印链表元素void print() {std::shared_ptr<Node<T>> temp = head;while (temp != nullptr) {std::cout << temp->data << " ";temp = temp->next;}std::cout << std::endl;}
};int main() {DoublyLinkedList<int> list;list.insert(1);list.insert(2);list.insert(3);list.insert(4);list.print(); // 输出: 1 2 3 4return 0;
}

#include <iostream>
#include <memory>// 定义栈节点结构
template <typename T>
struct Node {T data;std::shared_ptr<Node<T>> next;Node(const T& value) : data(value), next(nullptr) {}
};// 定义栈类
template <typename T>
class Stack {
private:std::shared_ptr<Node<T>> top;public:Stack() : top(nullptr) {}// 入栈操作void push(const T& value) {std::shared_ptr<Node<T>> newNode = std::make_shared<Node<T>>(value);newNode->next = top;top = newNode;}// 出栈操作void pop() {if (top != nullptr) {std::shared_ptr<Node<T>> temp = top;top = top->next;temp.reset();}}// 获取栈顶元素T& peek() {if (top != nullptr) {return top->data;}throw std::runtime_error("Stack is empty.");}// 判断栈是否为空bool isEmpty() {return top == nullptr;}
};int main() {Stack<int> stack;stack.push(1);stack.push(2);stack.push(3);std::cout << "Top element: " << stack.peek() << std::endl; // 输出: Top element: 3stack.pop();std::cout << "Top element: " << stack.peek() << std::endl; // 输出: Top element: 2return 0;
}

 队列

#include <iostream>
#include <memory>// 定义队列节点结构
template <typename T>
struct Node {T data;std::shared_ptr<Node<T>> next;Node(const T& value) : data(value), next(nullptr) {}
};// 定义队列类
template <typename T>
class Queue {
private:std::shared_ptr<Node<T>> front;std::shared_ptr<Node<T>> rear;public:Queue() : front(nullptr), rear(nullptr) {}// 入队操作void enqueue(const T& value) {std::shared_ptr<Node<T>> newNode = std::make_shared<Node<T>>(value);if (rear == nullptr) {front = newNode;rear = newNode;} else {rear->next = newNode;rear = newNode;}}// 出队操作void dequeue() {if (front != nullptr) {std::shared_ptr<Node<T>> temp = front;front = front->next;temp.reset();if (front == nullptr) {rear = nullptr;}}}// 获取队头元素T& peek() {if (front != nullptr) {return front->data;}throw std::runtime_error("Queue is empty.");}// 判断队列是否为空bool isEmpty() {return front == nullptr;}
};int main() {Queue<int> queue;queue.enqueue(1);queue.enqueue(2);queue.enqueue(3);std::cout << "Front element: " << queue.peek() << std::endl; // 输出: Front element: 1queue.dequeue();std::cout << "Front element: " << queue.peek() << std::endl; // 输出: Front element: 2return 0;
}

相关文章:

  • 【1】kettle的使用(全网最新版)
  • 深入理解java设计模式之单例模式
  • IEEE802.11a中的同步
  • Java18新特性总结
  • kubesphere踩过的坑,持续更新....
  • 《C++ Primer》导学系列:第 4 章 - 表达式
  • [CODE:-5504]没有[SYS.SYSOBJECTS]对象的查询权限
  • 应变玻璃合金是航天产业重要弹性材料 研究开发意义重大
  • 北京十大金牌律师事务所(2024年权威高胜诉率推荐)
  • 轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)
  • 模拟14位相机输出Verilog代码
  • CoppeliaSim机器人模拟器与Matlab Simulink环境
  • nodejs——原型链污染
  • web前端开发项目教学:深入剖析四大核心、五大技能、六大实战、七大建议
  • Swift Combine — Subject Publishers(PassthroughSubject CurrentValueSubject)
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《深入 React 技术栈》
  • 【css3】浏览器内核及其兼容性
  • 2019年如何成为全栈工程师?
  • Redash本地开发环境搭建
  • tweak 支持第三方库
  • Wamp集成环境 添加PHP的新版本
  • 搞机器学习要哪些技能
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 简析gRPC client 连接管理
  • 你不可错过的前端面试题(一)
  • 浅谈web中前端模板引擎的使用
  • 微信小程序:实现悬浮返回和分享按钮
  • 协程
  • 一个SAP顾问在美国的这些年
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​secrets --- 生成管理密码的安全随机数​
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • (1)SpringCloud 整合Python
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (C++17) std算法之执行策略 execution
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (八)c52学习之旅-中断实验
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (算法)求1到1亿间的质数或素数
  • (一)Thymeleaf用法——Thymeleaf简介
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)http-server应用
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .form文件_一篇文章学会文件上传
  • .Net 基于MiniExcel的导入功能接口示例
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net生成的类,跨工程调用显示注释
  • .Net中的集合
  • .php结尾的域名,【php】php正则截取url中域名后的内容