第三部分:数据结构与算法(概述)
C++中的数据结构与算法是程序设计的重要组成部分,以下是一些常见的数据结构和算法及其在C++中的实现与应用:
一、数据结构
1. 数组(Array)
数组是一种线性数据结构,它存储一组相同类型的元素,这些元素在内存中是连续存储的。
在C++中,可以使用原生数组或者std::vector(动态数组)来表示。
示例(使用原生数组)
#include <iostream>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
return 0;
}示例(使用std::vector)
#include <vector>
#include <iostream>
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}2. 链表(Linked List)
链表是由一系列节点组成的数据结构,每个节点包含数据和指向下一个节点的指针。链表可以分为单链表、双链表和循环链表等。
单链表示例(节点定义和链表操作)
// 单链表节点定义
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(NULL) {}
};
// 构建单链表
ListNode* createLinkedList() {
ListNode* head = new ListNode(1);
ListNode* node2 = new ListNode(2);
ListNode* node3 = new ListNode(3);
head->next = node2;
node2->next = node3;
return head;
}
// 遍历单链表
void traverseLinkedList(ListNode* head) {
ListNode* current = head;
while (current!= NULL) {
std::cout << current->val << " ";
current = current->next;
}
std::cout << std::endl;
}3. 栈(Stack)
栈是一种后进先出(LIFO)的数据结构。在C++中,可以使用std::stack来实现栈的操作。
示例(使用std::stack)
#include <stack>
#include <iostream>
int main() {
std::stack<int> s;
s.push(1);
s.push(2);
s.push(3);
while (!s.empty()) {
std::cout << s.top() << " ";
s.pop();
}
std::cout << std::endl;
return 0;
}4. 队列(Queue)
队列是一种先进先出(FIFO)的数据结构。在C++中,可以使用std::queue来实现队列的操作。
示例(使用std::queue)
#include <queue>
#include <iostream>
int main() {
std::queue<int> q;
q.push(1);
q.push(2);
q.push(3);
while (!q.empty()) {
std::cout << q.front() << " ";
q.pop();
}
std::cout << std::endl;
return 0;
}5. 树(Tree)
树是一种非线性的数据结构,由节点和边组成,有一个根节点,每个节点可以有零个或多个子节点。二叉树是树结构的一种特殊形式,其中每个节点最多有两个子节点(左子节点和右子节点)。
二叉树节点定义和简单遍历示例
// 二叉树节点定义
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 前序遍历二叉树
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
std::cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}6. 图(Graph)
图是由顶点(节点)和边组成的数据结构,可以用来表示各种复杂的关系,如社交网络中的人际关系、交通网络中的道路连接等。图可以分为有向图和无向图。
简单的图表示(邻接矩阵)和深度优先搜索示例(针对无向图)
#include <iostream>
#include <vector>
// 使用邻接矩阵表示无向图
class Graph {
public:
Graph(int numVertices) : numVertices(numVertices) {
adjMatrix.resize(numVertices, std::vector<int>(numVertices, 0));
}
void addEdge(int src, int dest) {
adjMatrix[src][dest] = 1;
adjMatrix[dest][src] = 1;
}
void dfs(int startVertex) {
std::vector<bool> visited(numVertices, false);
dfsUtil(startVertex, visited);
}
private:
int numVertices;
std::vector<std::vector<int>> adjMatrix;
void dfsUtil(int vertex, std::vector<bool>& visited) {
visited[vertex] = true;
std::cout << vertex << " ";
for (int i = 0; i < numVertices; ++i) {
if (adjMatrix[vertex][i] == 1 &&!visited[i]) {
dfsUtil(i, visited);
}
}
}
};二、算法
1. 排序算法
冒泡排序(Bubble Sort)
冒泡排序是一种简单的排序算法,它通过反复比较相邻的元素并交换它们(如果它们的顺序错误),直到整个数组被排序。
#include <iostream>
void bubbleSort(int arr[], int n) {
for (int i = 0; i < n - 1; ++i) {
for (int j = 0; j < n - i - 1; ++j) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main() {
int arr[] = {2, 1, 9, 8, 5};
int n = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, n);
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}快速排序(Quick Sort)
快速排序是一种高效的排序算法,它采用分治策略。选择一个元素作为枢轴(pivot),将数组分为两部分,小于枢轴的元素和大于枢轴的元素,然后对这两部分递归地进行排序。
#include <iostream>
int partition(int arr[], int low, int high) {
int pivot = arr[high];
int i = low - 1;
for (int j = low; j < high; ++j) {
if (arr[j] <= pivot) {
++i;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
void quickSort(int arr[], int low, int high) {
if (low < high) {
int pi = partition(arr, low, high);
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
int arr[] = {5, 4, 3, 2, 1};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
for (int num : arr) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}2. 搜索算法
线性搜索(Linear Search)
线性搜索是一种简单的搜索算法,它顺序地遍历数组中的元素,直到找到目标元素或者遍历完整个数组。
#include <iostream>
int linearSearch(int arr[], int n, int target) {
for (int i = 0; i < n; ++i) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 3;
int result = linearSearch(arr, n, target);
if (result!= -1) {
std::cout << "Element found at index: " << result << std::endl;
} else {
std::cout << "Element not found." << std::endl;
}
return 0;
}二分搜索(Binary Search)
二分搜索是一种用于有序数组的高效搜索算法。它每次比较中间元素与目标元素,然后根据比较结果决定在数组的左半部分还是右半部分继续搜索。
#include <iostream>
int binarySearch(int arr[], int low, int high, int target) {
while (low <= high) {
int mid = low+(high - low) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int n = sizeof(arr) / sizeof(arr[0]);
int target = 3;
int result = binarySearch(arr, 0, n - 1, target);
if (result!= -1) {
std::cout << "Element found at index: " << result << std::endl;
} else {
std::cout << "Element not found." << std::endl;
}
return 0;
} C++编程语言基础
- C++:从入门到工作的教程
- 这是我的第一个 C++程序!
- C++中main函数有什么作用?
- C++中 #include 指令的作用
- C++中常用的预处理指令
- C++中 iostream 头文件定义了什么
- C++名称空间(namespace)
- C++标准库中 std 命名空间定义了些什么
- C++常用的头文件
- C++源代码的发布方式
- C++变量名的定义、变量的作用、使用规范
- C++的关键字列表
- C++数据类型:整型(整数类型)
- 二进制补码、原码、反码
- C++数据类型:char字符型(整数类型)
- ASCII码表及C++字符函数库(cctype)
- 计算机汉字编码
- C++数据类型:bool类型(整数类型)
- C++中 const 限定符
- C++数据类型:浮点数
- C++运算符:算术运算符
- C++运算符:类型转换规则
- 计算机数据存储大小端模式
- C++运算符:位运算 与 bitset类库
- C++运算符:关系运算符与逻辑运算符
- C++流程控制:顺序、选择、循环、跳转语句
- C++函数的定义、参数传递、重载、嵌套
- C++数组:一维、二维、多维数组的运用
- C-style字符串、库函数 与 std::string对象
- C++数据类型:结构体(struct)
- C++数据类型:联合体(union)
- C++数据类型:枚举(enum)
- C++数据类型别名:typedef
- C++指针
- C++内存操作符:new分配 与 delete释放
- C++标准模板库(STL)容器、算法、迭代器
- C++标准模板库(STL)vector顺序容器
- C++标准模板库(STL)array固定容器
- C++标准模板库(STL)list双向链表容器
- C++标准模板库(STL)deque双端队列
- C++标准模板库(STL)集合 set 关联容器
- C++标准模板库(STL)map关联容器
- C++标准模板库(STL)unordered_set
- C++标准模板库(STL)unordered_map
- C++标准模板库(STL)algorithm算法库
- C++文件操作
- C++数学库(cmath)数学常量与数学函数
- C++模板:函数模板、类模板
- C++与SQLite3联合打造实用的应用程序
- C++实战开发中常用的库(概述)
- 第二部分:C++面向对象编程
- C++:类的定义与声明、类对象应用
- 第三部分:数据结构与算法(概述)
- 第一部分:C++语言简介与学习路线
