在C++编程中,数据结构是一种组织和存储数据的方式,它定义了数据之间的关系,使得数据能够被有效地访问和修改。选择适当的数据结构对于解决特定的问题至关重要,因为它能直接影响到程序的效率和性能。下面是一些在C++中常见的数据结构,包括数组、链表、栈、队列、树和图等。
- 数组 (Array)
- 含义:数组是存储一系列相同类型元素的连续内存空间。
- 用途:用于存储一系列有序的数据,可以随机访问数组中的任意元素。
- 实现方式:在C++中,数组可以通过静态分配或动态分配来创建。
- 示例代码:
cpp复制代码
int staticArray[10]; // 静态数组,大小在编译时确定
int size = 10;
int* dynamicArray = new int[size]; // 动态数组,大小在运行时确定
- 链表 (LinkedList)
- 含义:链表是一种物理存储单元上非连续的、非顺序的线性表,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
- 用途:用于动态地进行元素的插入和删除,节省存储空间(特别是当元素数量未知时)。
- 实现方式:链表通常由一系列节点组成,每个节点至少包含两个部分:存储的数据和指向下一个节点的指针。
- 示例代码(单链表):
cpp复制代码
struct Node {
int data;
Node* next;
};
Node* head = nullptr; // 链表头指针
Node* newNode = new Node(); // 创建新节点
newNode->data = 1;
newNode->next = head;
head = newNode; // 将新节点插入链表头部
- 栈 (Stack)
- 含义:栈是一种后进先出(LIFO)的数据结构。
- 用途:用于函数调用、表达式求值、深度优先搜索等。
- 实现方式:栈可以用数组或链表来实现,通常包含push(压栈)和pop(弹栈)操作。
- 示例代码(使用STL中的stack):
cpp复制代码
#include <stack>
std::stack<int> myStack;
myStack.push(1); // 压栈
myStack.push(2);
int topElement = myStack.top(); // 查看栈顶元素
myStack.pop(); // 弹栈
- 队列 (Queue)
- 含义:队列是一种先进先出(FIFO)的数据结构。
- 用途:用于缓冲、事件调度、广度优先搜索等。
- 实现方式:队列也可以用数组或链表来实现,通常包含enqueue(入队)和dequeue(出队)操作。
- 示例代码(使用STL中的queue):
cpp复制代码
#include <queue>
std::queue<int> myQueue;
myQueue.push(1); // 入队
myQueue.push(2);
int frontElement = myQueue.front(); // 查看队首元素
myQueue.pop(); // 出队
- 树 (Tree)
- 含义:树是一种非线性数据结构,或是实现抽象数据类型(ADT)或是实现集合类型,用来模拟具有树状结构性质的数据集合。
- 用途:用于表示层次结构,如文件系统、XML和JSON解析、数据库索引等。
- 实现方式:树通常由节点和边组成,每个节点可以有零个或多个子节点,但只有一个父节点(除了根节点没有父节点)。
- 示例代码(二叉树):
cpp复制代码
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
- 图 (Graph)
- 含义:图是由顶点(或节点)和连接这些顶点的边构成的集合。
- 用途:用于表示对象之间的关系,如社交网络、地图、电路网络等。
- 实现方式:图可以通过邻接矩阵、邻接表等方式来实现。
- 示例代码(邻接表表示无向图):
cpp复制代码
#include <vector>
#include <iostream>
class Graph {
int numVertices; // 顶点数
std::vector<std::vector<int>> adjList; // 邻接表
public:
Graph(int vertices) {
numVertices = vertices;
adjList.resize(vertices);
}
void addEdge(int src, int dest) {
adjList[src].push_back(dest); // 无向图需要双向添加边
adjList[dest].push_back(src); // 如果是有向图,此行可以省略
}
void printGraph() {
for (int i = 0; i < numVertices; i++) {
std::cout << "Vertex " << i << " is connected to: ";
for (int j : adjList[i]) {
std::cout << j << " ";
}
std::cout << std::endl;
}
}
};
int main() {
Graph g(5); // 创建一个包含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 0;
}