c++ 实现基本数据结构代码

2023-05-16

数据结构是计算机科学的一个重要的分支,主要研究如何有效地存储和组织数据以便于快速访问和操作。

常见的数据结构有:

  • 数组:是一种线性的数据结构,可以通过索引来访问数组中的元素。
  • 链表:是一种非线性的数据结构,由节点组成,每个节点存储数据并与其他节点相连。
  • 栈:是一种特殊的数据结构,只允许在顶部插入和删除元素。
  • 队列:是一种特殊的数据结构,只允许在队尾插入元素,在队头删除元素。
  • 树:是一种非线性的数据结构,以根节点为核心,通过父节点和子节点的关系构成。
  • 图:是一种非线性的数据结构,由节点和边构成,可以表示一组具有特定关系的数据。

#include <iostream>

#include <stack>

#include <vector>

using namespace std;


//数组:实际上是静态的列表,以连续的内存地址存储元素
void arr()
{
	int arr[5] = {1, 2, 3, 4, 5};
	
	for (int i=0; i < 5; ++i)
		{
			cout << arr[i] <<endl;
		}
 	return;
}


//链表:是一种动态的列表,每个元素都是一个节点,包含数据和指向下一个节点的指针
struct ListNode {
	int data;
	ListNode *next;
};


void list()
{
	ListNode *head = new ListNode;
	head->data = 1;
	head->next = new ListNode;
	head->next->data = 2;
	head->next->next = new ListNode;
	head->next->next->data = 3;
	head->next->next->next = nullptr;

	ListNode *node = head;
	while(nullptr != node)
	{
		cout << node->data << endl;
		node = node->next;
	}
	
	return;
}

//栈:是一种后进先出(LIFO)的数据结构,通常使用数组或链表实现

void Stack()
{
	stack<int> s;

	s.push(1);
	s.push(2);
	s.push(3);

	while(!s.empty())
	{
		//top()是取栈顶元素,不会删除里面的元素,返回栈顶的引用
		//pop()是删除栈顶元素
		cout << s.top() <<endl;
		s.pop();
	}

	return;
}

//队列 是一种先进先出(FIFO)的数据结构,通常使用数组或链实现

//设置队列最大成员数
const int MAX_SIZE = 100;

class Queue {
	private:
		int data[MAX_SIZE];
		int front, rear;

	public:
		Queue() 
		{
			data[MAX_SIZE] = {0};
			front = 0;
			rear = -1;
		}

		bool isEmpty() 
		{
			return -1 == rear;
		}

		bool isFull() 
		{
			return MAX_SIZE-1 == rear;
		}

		void enqueue(int value) 
		{
			if (isFull()) 
			{
				cout << "Queue is full" << endl;
				//循环队列可以做
				return;
			}

			rear++;
			data[rear] = value;
		}

		void dequeue() 
		{
			if (isEmpty()) 
			{
				cout << "Queue is empty" << endl;
				return;
			}
			front++;
			// 可以做个循环队列
			// if (MAX_SIZE == front)
			// {
			// 	front = 0;
			// }
		}

		int getFront() 
		{
			if (isEmpty()) 
			{
				cout << "Queue is empty" << endl;
				return -1;
			}

			return data[front];
		}
};

void queue()
{
	Queue q;

	int queueSize = 5;
	for (int i = 1; i < queueSize; i++)
	{
		q.enqueue(i);
	}

	for (int i = 1; i < queueSize; i++)
	{
		cout << q.getFront() << endl;
		q.dequeue();
	}

	return;
}

//简单的二叉树 实现了一个二叉搜索树的基本功能,可以插入节点,遍历节点,并输出以中序遍历的形式

struct Node {
	int data;
	Node *left, *right;
};

class Tree {
	public:
		Node *root;
		Tree() {root = nullptr;}

		Node* createNode(int data)
		{
			Node *newNode = new Node;
			newNode->data = data;
			newNode->left = newNode->right = nullptr;
			return newNode;
		}

		void insertNode(Node *&node, int data)
		{
			if (!node)
			{
				node = createNode(data);
				//创建的第一个节点是根节点
				if (!root) 
				{
					root = node;
				}
			}
			//代码可优化
			else if (data < node->data)
			{
				insertNode(node->left, data);
			}
			else
			{
				insertNode(node->right, data);
			}
		}

		//顺序遍历
		void inOrderTraversal(Node *node)
		{
			if (node)
			{
				inOrderTraversal(node->left);
				cout << node->data << " ";
				inOrderTraversal(node->right);
			}
		}
};

void tree()
{
	Tree tree;
	tree.insertNode(tree.root, 50);
	tree.insertNode(tree.root, 30);
	tree.insertNode(tree.root, 20);
	tree.insertNode(tree.root, 40);
	tree.insertNode(tree.root, 70);
	tree.insertNode(tree.root, 60);
	tree.insertNode(tree.root, 80);

	cout << "In-Order Traversal: ";
	tree.inOrderTraversal(tree.root);
	cout << endl;

	return;
}

//图 
class Graph{
	int V; //顶点数
	vector<int> *adj; //领接表

	public:
		Graph(int V)
		{
			this->V = V;
			adj = new vector<int>[V];
		}

		~Graph()
		{
			V = 0;
			delete[] adj;
			adj = nullptr;
		}

		//向图中添加一条边
		void addEdge(int v, int w)
		{
			adj[v].push_back(w);
		}

		//打印图中所有的边
		void printGraph()
		{
			for (int i = 0; i < V; i++)
			{
				cout << "顶点" << i << "的领接点:";
				for (int j = 0; j < adj[i].size(); j++)
				{
					cout << adj[i][j] << " ";
				}
				cout << endl;
			}
		}
};

void graph()
{
	Graph g(5); //创建图
	g.addEdge(0, 1); //添加边
	g.addEdge(0, 4);
	g.addEdge(1, 2);
	g.addEdge(1, 3);
	g.addEdge(1, 4);
	g.addEdge(2, 3);
	g.addEdge(3, 4);

	g.printGraph(); // 打印图中所有的边

	return;
}

//数据结构基本打印

int main()
{
	cout << "array" << endl;
	arr();
	
	cout << "list" << endl;
	list();

	cout << "stack" << endl;
	Stack();

	cout << "queue" << endl;
	queue();

	cout << "tree" << endl;
	tree();

	cout << "graph" << endl;
	graph();

	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++ 实现基本数据结构代码 的相关文章

  • [paper]Feature Squeezing: Detecting Adversarial Examples in Deep Neural Networks

    本文提出了两种特征压缩方法 xff1a 减少每个像素的颜色位深度使用空间平滑来减少各个像素之间的差异 特征压缩通过将与原始空间中许多不同特征向量相对应的样本合并为单个样本 xff0c 从而减少了对手可用的搜索空间 通过将DNN模型对原始输入
  • C# List集合查找删除指定数据

    C List集合查找删除指定数据 文章目录1 实体类2 操作第一个负荷条件数据3 操作所有符合条件数据4 优质源码 文章目录 1 实体类 public class FaultLevelModel public string LBWJ get
  • 【论文阅读】AM-Softmax:Additive Margin Softmax for Face Verification. 1801.05599.【损失函数设计】

    原文链接 xff1a https blog csdn net weixin 43154149 article details 122611784 文章目录 1 四个问题2 论文简介1 Introduction xff08 相关工作 xff1
  • MobaXterm连接出现 Network error: Connection timed out 问题解决

    MobaXterm连接出现 Network error Connection timed out xff1a 接前文 xff1a CentOS安装 点此查看文章 xff0c 安装之后的SSH连接 xff1a 解决思路如下 xff1a 1 检
  • 撰写论文时如何复制参考文献公式----Mathpix及Mathtype教程

    同学们好啊 xff0c 我们在写论文时常常需要使用一些复杂的公式 xff0c 自己对着敲又费时费力 xff0c 那么如何才能讲文献中或者书本上的公式复制在自己的文章中嘞 xff1f 阿阮分享两个公式神器 xff0c 配合使用效果更好哈 xf
  • 驱动及驱动开发的简单理解

    一直对驱动有着强烈的好奇心 xff0c 怎奈工作始终与其无缘 xff0c 且未来也不大可能接触驱动 因此 xff0c 今天用了一些时间 xff0c 去简单的了解了一下驱动及驱动开发 如果有错误的理解 xff0c 请予以指正 xff0c 不胜
  • Mac ping IP+端口

    MacOS中ping IP 43 端口 nc vz w 2 192 168 1 1 8080 windows下 telnet 192 168 1 1 8080
  • 对文件夹下所有灰度图片进行像素值的修改

    最近在跑UNet训练的时候 xff0c 想用自己的数据集做训练 xff0c 发现数据集无法加载进去 xff0c 对比了一下源码所使用的数据集 xff0c 发现是gt的像素值不对导致的 xff0c 为了省事就写了个修改gt像素值的小脚本 im
  • Linux操作系统-信号量

    信号量也属于一种进程间通信的机制 xff0c 与其他的进程间通信不同 xff0c 信号量不是用来传输数据的 xff0c 而是用来进程间同步与互斥 除此之外 xff0c 信号量还可以实现线程间的互斥 信号量是什么 xff1f 信号量的本质是一
  • 你应该知道的 50 个 Python 单行代码

    你应该知道的 50 个 Python 单行代码 1 字母移位词 xff1a 猜字母的个数和频次是否相同2 二进制转十进制3 转换成小写字母4 转换成大写字母5 字符串转换为字节类型6 复制文件7 快速排序8 n 个连续数之和9 赋值交换10
  • npm安装报错ETIMEOUT

    npm安装报错 npm安装报错 xff1a npm ERR code ETIMEDOUT npm ERR errno ETIMEDOUT npm ERR network request to https registry npmjs org
  • JavaScript中的异步

    一 什么叫异步 xff1f 在JS中有同步和异步两种模式 1 同步 xff08 Synchronous xff09 一般指后一个任务等待前一个任务结束 xff0c 程序的执行顺序与任务的排列顺序是一致的 2 异步 xff08 Asynchr
  • 北邮人论坛镜像

    http bbs cloud icybee cn default
  • RLock锁的使用

    try RLock lock 61 redissonClient getLock 34 ppt pos sms code lock 34 43 34 orderSmsCode 34 System out println 34 得到的锁 34
  • Ubuntu开机自动挂载SD卡到指定挂载点并将Docker默认存储路径改为SD卡

    Ubuntu开机自动挂载SD卡到指定挂载点并将Docker默认存储路径改为SD卡 查看磁盘信息查看磁盘原挂载点永久开机自动挂载分区 修改文件 etc fstab应用挂载修改docker默认存储路径 查看磁盘信息 sudo fdisk l 如
  • JS数组对象,过滤掉不要的对象

    其实本来很简单 xff0c 奈何我自己把自己绕进去了 又是觉得自己不适合干开发的一天啊 const array1 61 id null name null id null name null id 1 name 2 我需要筛出不同时为空的数
  • Hadoop权威指南

    1 Hadoop基础知识 第1章 初识Hadoop Hadoop代替配有大量硬盘的数据库来进行大规模数据分析的原因是 xff1a 传输速率 xff08 取决于硬盘的带宽 xff09 的提升远大于寻址时间 xff08 将磁头移动到特定硬盘位置
  • 创建新分支,拉取代码

    1 查看当前已存在分支 git branch 2 创建新的分支 创建一个dev分支 git checkout b dev 3 提交分支到远程仓库 git push origin dev 4 删除本地分支 git branch D dev
  • 操作系统之什么是中断?

    什么是中断 xff1f 在学习操作系统中 xff0c 经常性的会看到中断这个概念 xff0c 最典型的就是汇编代码中的int命令 用一个比较通俗的概念来说 xff0c 就是计算机会连接许多外接设备 xff0c 包括磁盘 显示器 键盘鼠标等等
  • 树莓派断网自动重连WiFi

    树莓派WiFi有时候信号不好会断 xff0c 并不会自动重新连网 解决办法是 xff1a 写一个自动断网重连的脚本 xff0c 让pi定时执行并检查网络是否连通 xff0c 如断网则自动重新连接 连接还是失败 xff0c 重启 1 xff0

随机推荐

  • Flask 中使用 AJAX 异步加载 Bootstrap 表格(Tables)

    Flask 中使用 AJAX 异步加载 Bootstrap 表格 Tables 1 快速安装 2 一步一步做 3 概述 4 项目结构 4 1 Python 部分 app py 4 2 HTML 部分 index html 4 3 Styli
  • OpenMV超声波测距

    OpenMV超声波测距 本文首发于 xff1a https www bilibili com read cv3051569 参考链接 xff1a https blog csdn net bei dai he article details
  • Git常用命令pull、push、fetch

    pull pull意为拉 xff0c 这里引申为拉取代码 在Git命令中使用pull xff0c 会将你的远程代码拉取到本地并进行合并 格式 xff1a git pull lt 远程主机名 gt lt 远程分支名 gt lt 本地分支名 g
  • Ubuntu系统man命令中文汉化

    1 下载中文包 进入 opt xff0c 使用管理权限下载 xff1a wget https src fedoraproject org repo pkgs man pages zh CN manpages zh 1 5 1 tar gz
  • 文末彩蛋 | 这个 Request URL 长得好不一样

    有朋友拿到一个网站请求的链接问这要怎么解密 xff1f 很明显这不是加密的数据 xff0c 这是一张图片 base64 后的结果 xff0c 第一次写爬虫朋友遇到这样的请求 xff0c 可能需要琢磨一下这是什么东西 如果有遇到类似数据 xf
  • Redis(十) 布隆过滤器

    速记 为什么使用布隆过滤器 xff1f 1 为了省内存 xff0c 提高速率 2 因为1所以布隆过滤器不需要百分百正确 3 说存在不一定存在 xff0c 说不存在一定不存在 4 在解决缓存穿透的问题时 xff0c 拦截了大部分的请求 xff
  • 第五章:数学运算-statistics:统计计算-平均值

    5 5 statistics 统计计算 statistics模块实现常用的统计公式 xff0c 允许使用python的各种数值类型 xff08 int float xff0c Decimal和Fraction 来完成高效计算 5 5 1 平
  • 用proxychains4解决rosdep init问题教程

    在终端下载源码 sudo git clone https github com rofl0r proxychains ng git 进入安装目录 cd proxychains ng 配置 configure prefix 61 usr sy
  • 使用 TX2 和 realsense D435i 相机运行 ORBSLAM3

    非 ROS 版本 之后可能会更新 ROS 版本的 ORBSLAM3 配置指南 TODO 目录 TX2 刷机JetPack 4 6 1安装 realsense SDK 2 0编译 opencv 4 5 0编译 Pangolin 0 5编译运行
  • 解决 cv_bridge 与 opencv4 版本冲突问题

    解决了在 ROS melodic noetic 下 cv bridge 与 opencv4 版本冲突导致的 opencv 操作 导致 Segmentation fault core dumped 的问题 目录 问题描述解决方法参考 问题描述
  • 我对onSizeChange方法的源码解析

    如果当前的自定义控件是继承ViewGroup xff0c 那么在ViewGroup重写的layout方法中 xff1a 可知调用父类也就是View的layout方法 再看View的layout方法 xff1a 查看设置自己坐标的setFra
  • 5 个你不知道的关于 Python 类的技巧

    5 个你不知道的关于 Python 类的技巧 1 创建 一个 常量值2 多个类构造函数3 创建枚举4 迭代器5 以列表的形式访问一个类 Python 有许多强大的特性 xff0c 在处理类时提供了极大的灵活性 在这里 xff0c 我将向您展
  • 激光雷达和RTK的标定(无人小车)

    总结一下最近的标定工作 xff0c 标定平台是实验室的无人小车 xff0c 目标是实现激光雷达 lidar 和RTK的标定 xff0c 也就是求解lidar到RTK的位姿变换矩阵 采用的代码是ETH的lidar align https gi
  • 虚拟机安装Ubuntu20.04 + VCS2018

    虚拟机安装Ubuntu20 04 43 VCS2018 前言正文1 准备内容Vmware Workstation 16 prounbuntu 20 04 安装包vcs 43 scl 43 verdi等安装包 2 Ubuntu系统的安装ope
  • input里面file实现上传图片及预览功能

    在这里插入简单的HTML代码片 lt form action 61 34 34 gt 文件 xff1a lt input type 61 34 file 34 name 61 34 myFile 34 id 61 34 myFile 34
  • 创建ROS-wrapper

    创建ROS wrapper 对高博的ygz stereo inertial的开源算法添加ROS node源文件的编写CMakeLists文件的编写分目录下的CMakeLists完整CMakeLists路径 home fei devv ygz
  • 新买了块翼联的AX200的网卡,结果开移动热点的时候遇到了点问题

    买网卡这事的起因要从入手了switch说起 xff0c 直连网不是不能用 xff0c 就是太难用了 xff0c 下载个东西要几十个小时 xff0c 玩个马造2连地图都下载不了 然后试用了3天的网易uu加速器 xff0c 好用是真的好用 xf
  • HDU 1085(Holding Bin-Laden Captive!)

    题意 xff1a 有三种价值分别为 1 2 5 的硬币 xff0c 每一种分别由 a b c 个 xff0c 求这些硬币不能组成的最小价值 分析 xff1a 生成函数板子题 xff08 贴一个讲生成函数的链接https blog csdn
  • 大电流的走线和过孔

    工程师在设计的时候 xff0c 很容易忽略走线宽度的问题 xff0c 因为在数字设计时 xff0c 走线宽度不在 考虑范围里面 通常情况下 xff0c 都会尝试用最小的线宽去设计走线 xff0c 这时 xff0c 在大电流时 xff0c 将
  • c++ 实现基本数据结构代码

    数据结构是计算机科学的一个重要的分支 xff0c 主要研究如何有效地存储和组织数据以便于快速访问和操作 常见的数据结构有 xff1a 数组 xff1a 是一种线性的数据结构 xff0c 可以通过索引来访问数组中的元素 链表 xff1a 是一