C++ 算法与数据结构:从理论到实践
\n\n掌握算法与数据结构是成为专业开发人员的关键阶段。如果没有深入理解如何高效地组织和处理数据,就无法创建高性能、可扩展的应用程序。C++ 提供了底层内存操作和高性能的独特能力,使其成为学习这一主题的理想语言。
\n\n在本文中,我们将通过实用的代码示例探讨 C++ 中的基础算法与数据结构,您可以立即将其应用到自己的项目中。我们不会深入抽象的数学推导——我们的重点是实际实现和理解工作原理。
\n\n1. 动态数组与内存管理
\n\n我们从基础开始——动态数组。与静态数组(其大小在编译时固定)不同,动态数组允许在程序运行时改变大小。在 C++ 中,使用 new[] 和 delete[] 运算符来实现。
#include <iostream>\n\nint main() {\n int size = 5;\n int* arr = new int[size]; // 分配内存\n \n // 初始化\n for(int i = 0; i < size; i++) {\n arr[i] = i * 10;\n }\n \n // 输出\n for(int i = 0; i < size; i++) {\n std::cout << arr[i] << " ";\n }\n \n delete[] arr; // 释放内存\n return 0;\n}\n\n重要的是要记住,在使用动态内存时,您有责任释放它。内存泄漏是 C++ 中最常见的问题之一。建议使用标准库中的智能指针(std::unique_ptr、std::shared_ptr)来自动管理内存。
2. 栈与队列:经典数据结构
\n\n栈和队列是两种基础数据结构,分别实现了 LIFO(后进先出)和 FIFO(先进先出)原则。让我们看看它们在 C++ 中使用动态数组的实现。
\n\n栈的实现
\n\n#include <iostream>\n#include <stdexcept>\n\nclass Stack {\nprivate:\n int* data;\n int capacity;\n int top;\n \npublic:\n Stack(int size) : capacity(size), top(-1) {\n data = new int[capacity];\n }\n \n ~Stack() {\n delete[] data;\n }\n \n void push(int value) {\n if(top >= capacity - 1) {\n throw std::overflow_error("Stack overflow");\n }\n data[++top] = value;\n }\n \n int pop() {\n if(isEmpty()) {\n throw std::underflow_error("Stack underflow");\n }\n return data[top--];\n }\n \n bool isEmpty() const {\n return top == -1;\n }\n \n int peek() const {\n if(isEmpty()) {\n throw std::underflow_error("Stack is empty");\n }\n return data[top];\n }\n};\n\nint main() {\n Stack stack(5);\n stack.push(10);\n stack.push(20);\n stack.push(30);\n \n std::cout << "栈顶元素: " << stack.peek() << std::endl;\n std::cout << "弹出: " << stack.pop() << std::endl;\n std::cout << "弹出: " << stack.pop() << std::endl;\n \n return 0;\n}\n\n队列的实现
\n\n#include <iostream>\n\nclass Queue {\nprivate:\n int* data;\n int capacity;\n int front;\n int rear;\n int count;\n \npublic:\n Queue(int size) : capacity(size), front(0), rear(-1), count(0) {\n data = new int[capacity];\n }\n \n ~Queue() {\n delete[] data;\n }\n \n void enqueue(int value) {\n if(isFull()) {\n throw std::overflow_error("Queue overflow");\n }\n rear = (rear + 1) %