引言:栈的核心价值与C++实现优势
栈(Stack)作为后进先出(LIFO)的线性数据结构,是计算机科学中不可或缺的基础工具。其核心特性包括:
操作受限性:仅允许在栈顶进行插入(push)和删除(pop)操作
高效性:所有操作的时间复杂度均为O(1)
典型应用:函数调用栈、表达式求值、回溯算法等
在C++中,栈的实现既可通过原生数组/链表构建,也可直接利用标准库<stack>,这种灵活性使其成为理解内存管理和算法设计的重要切入点。
一、基础篇:栈的实现与标准库应用
1.1 栈的三种实现方式
数组模拟栈(需处理栈满扩容):
template<typename T>
class ArrayStack {
private:
T* arr;
int top;
int capacity;
public:
void push(T value) {
if (top == capacity) resize();
arr[top++] = value;
}
T pop() {
if (top == 0) throw underflow;
return arr[--top];
}
};
链表实现栈(动态内存管理):
template<typename T> class LinkedStack
{ private:
struct Node {
T data; Node* next;
}; Node* head;
public: void push(T value) { Node* newNode = new Node{value, head}; head = newNode; } T pop() { Node* temp = head; head = head->next; T val = temp->data; delete temp; return val; } };
标准库栈(推荐生产环境使用):
#include <stack> int main()
{
std::stack<int> s;
s.push(1); // 入栈
int val = s.top(); // 访问栈顶
s.pop(); // 出栈
return 0;
}
1.2 基础应用场景
括号匹配检测:通过栈验证表达式合法性
进制转换:利用栈实现十进制到其他进制的转换
撤销操作:编辑器中的撤销功能本质是栈的应用
二、进阶篇:栈的深度优化与扩展应用
2.1 循环栈与空间优化
通过模运算实现环形缓冲区,避免频繁内存分配:
int top = -1; int size = 10;
int* arr = new int[size];
void push(int val) {
arr[++top % size] = val;
}
int pop() {
return arr[top-- % size];
}
2.2 多线程安全栈
结合互斥锁实现线程安全操作:
#include <mutex> std::mutex mtx; std::stack<int> s;
void threadSafePush(int val) {
std::lock_guard<std::mutex> lock(mtx);
s.push(val); } int threadSafePop() {
std::lock_guard<std::mutex> lock(mtx);
return s.empty() ? -1 : s.pop(); }
2.3 高级应用案例
递归转迭代:用显式栈替代系统调用栈
深度优先搜索(DFS):栈实现非递归版DFS
表达式求值:结合逆波兰算法处理复杂运算
2.4 性能对比与选型建议
实现方式
平均操作耗时
内存开销
适用场景
标准库<stack>
最低
中等
生产环境
链表实现
中等
动态分配
需要动态扩容的场景
数组实现
最高
固定预分配
实时性要求高的系统
886

被折叠的 条评论
为什么被折叠?



