第三部分:数据结构与算法(概述)
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; }