C++算法与数据结构:从基础到实践
掌握算法与数据结构是每位程序员成长道路上的关键阶段。本文将以C++语言为例,剖析基础概念。您将学习如何高效组织数据并编写快速算法,这些将成为您项目的基础。内容适合初学者和中级开发者。
什么是算法与数据结构?
算法是解决特定问题的明确操作步骤序列。数据结构是组织和存储数据的方式,确保高效的访问与修改。在C++中,这两个概念紧密相关:选择正确的数据结构可将算法速度提升数十倍。
C++中的主要数据结构:
- 数组 — 固定大小的同类型元素集合
- 链表 — 动态序列
- 栈与队列 — 受限访问结构
- 树 — 层次化结构
- 哈希表 — 基于键的快速查找
数组及其操作
数组是最简单的数据结构,元素存储在连续内存区域中。在C++中,数组分为静态数组和动态数组。
#include <iostream>using namespace std;
int main() { // 静态数组 int arr[5] = {10, 20, 30, 40, 50}; // 动态数组(通过new) int* dynArr = new int[3]; dynArr[0] = 1; dynArr[1] = 2; dynArr[2] = 3; // 输出元素 for (int i = 0; i < 5; i++) { cout << arr[i] << " "; } delete[] dynArr; // 释放内存 return 0;}线性查找算法在数组中:
int linearSearch(int arr[], int n, int x) { for (int i = 0; i < n; i++) { if (arr[i] == x) return i; // 返回索引 } return -1; // 未找到}复杂度:O(n)。为提升速度,请使用STL中的std::vector——它能自动管理内存。
链表:单向链表与双向链表
链表由节点组成,每个节点包含数据以及指向下一个(或上一个)元素的指针。在C++中,常用std::forward_list(单向链表)和std::list(双向链表)。
简单单向链表的实现:
struct Node { int data; Node* next;};
class LinkedList {private: Node* head;public: LinkedList() : head(nullptr) {} void insert(int val) { Node* newNode = new Node{val, nullptr}; if (!head) { head = newNode; return; } Node* temp = head; while (temp->next) temp = temp->next; temp->next = newNode; } void display() { Node* temp = head; while (temp) { cout << temp->data << " -> "; temp = temp->next; } cout << "nullptr" << endl; }};链表的优点:
- 动态大小
- 中间插入和删除速度快(若有指针则为O(1))
缺点:
- 按索引访问慢(O(n))
- 指针占用额外内存
栈与队列:LIFO与FIFO原则
栈(Stack)遵循“后进先出”(LIFO)原则。队列(Queue)遵循“先进先出”(FIFO)原则。在C++中,它们已在STL中实现。
栈的使用示例:
#include <stack>#include