探索C++中的数据结构:栈(Stack)的奥秘

引言

栈是计算机科学中最基础且重要的数据结构之一,它像一摞盘子一样遵循"后进先出"(LIFO)的原则。无论是函数调用、表达式求值,还是浏览器前进后退功能,栈都扮演着关键角色。本文将深入解析栈的C++实现及其应用场景。


一、栈的核心概念

1.1 什么是栈?

  • 定义:只能在一端(栈顶)进行插入(push)和删除(pop)操作的线性表

  • 特点

    • 后进先出(Last In First Out)

    • 时间复杂度均为O(1)的基本操作

    • 大小可固定(数组实现)或动态(链表实现)

1.2 基本操作

操作 功能描述
push() 元素入栈
pop() 栈顶元素出栈
top() 查看栈顶元素
empty() 判断栈是否为空
size() 返回栈中元素数量

二、C++实现栈

2.1 数组实现(固定大小)

cpp 复制代码
template <typename T, int MAX_SIZE = 100>
class ArrayStack {
private:
    T data[MAX_SIZE];
    int topIndex = -1;

public:
    void push(T value) {
        if (topIndex >= MAX_SIZE-1)
            throw std::overflow_error("Stack overflow");
        data[++topIndex] = value;
    }

    T pop() {
        if (empty())
            throw std::underflow_error("Stack underflow");
        return data[topIndex--];
    }

    T top() const {
        if (empty())
            throw std::runtime_error("Stack is empty");
        return data[topIndex];
    }

    bool empty() const { return topIndex == -1; }
    int size() const { return topIndex + 1; }
};

2.2 链表实现(动态大小)

cpp 复制代码
template <typename T>
class LinkedListStack {
private:
    struct Node {
        T data;
        Node* next;
        Node(T val) : data(val), next(nullptr) {}
    };
    
    Node* topNode = nullptr;
    int count = 0;

public:
    void push(T value) {
        Node* newNode = new Node(value);
        newNode->next = topNode;
        topNode = newNode;
        count++;
    }

    T pop() {
        if (empty())
            throw std::underflow_error("Stack underflow");
        
        Node* temp = topNode;
        T val = temp->data;
        topNode = topNode->next;
        delete temp;
        count--;
        return val;
    }

    // ...其他方法实现类似数组版本
};

三、栈的典型应用

3.1 括号匹配检测

cpp 复制代码
bool isBalanced(const string& expr) {
    stack<char> s;
    for (char c : expr) {
        if (c == '(' || c == '[' || c == '{') {
            s.push(c);
        } else {
            if (s.empty()) return false;
            char top = s.top();
            if ((c == ')' && top != '(') ||
                (c == ']' && top != '[') ||
                (c == '}' && top != '{'))
                return false;
            s.pop();
        }
    }
    return s.empty();
}

3.2 其他常见应用场景

  1. 函数调用栈

  2. 表达式求值(逆波兰表达式)

  3. 浏览器历史记录

  4. 撤销(Undo)操作

  5. 迷宫路径查找


四、STL中的stack容器

C++标准库提供了现成的stack模板:

cpp 复制代码
#include <stack>

stack<int> s;
s.push(10);
s.pop();

// 重要方法:
// empty(), size(), top(), push(), pop()

五、栈的复杂度分析

操作 时间复杂度 空间复杂度
push() O(1) O(n)
pop() O(1) O(n)
top() O(1) O(1)
empty() O(1) O(1)

结语

栈作为一种基础数据结构,其简洁性和高效性使其成为算法设计中的重要工具。理解栈的底层实现有助于开发者更好地利用这一数据结构解决实际问题。建议读者尝试实现自己的栈类,并通过LeetCode等平台上的相关题目(如:20.有效的括号、155.最小栈)来巩固学习成果。

相关推荐
andlbds1 分钟前
Ubuntu20.04安装Pangolin遇到的几种报错的解决方案
开发语言·c++
xixixin_3 分钟前
【uniapp】uni.setClipboardData 方法失效 bug 解决方案
java·前端·uni-app
工业互联网专业7 分钟前
基于springboot+vue的校园二手物品交易平台
java·vue.js·spring boot·毕业设计·源码·课程设计·校园二手物品交易平台
isfox14 分钟前
一文拆解 Java CAS:从原理到避坑全攻略
java
JPC客栈21 分钟前
LeetCode面试经典 150 题(Java题解)
java·leetcode·面试
HyperAI超神经31 分钟前
【vLLM 学习】Aqlm 示例
java·开发语言·数据库·人工智能·学习·教程·vllm
异常驯兽师31 分钟前
IntelliJ IDEA 项目导入后 Java 文件图标显示为红色小写 j 的解决方法
java·路径配置
永不停转31 分钟前
QT 实现 C++ 数据类与 json 的转换
c++·qt
纪元A梦34 分钟前
华为OD机试真题——数据分类(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·javascript·c++·python·华为od·go·华为od机试题
常年游走在bug的边缘43 分钟前
基于spring boot 集成 deepseek 流式输出 的vue3使用指南
java·spring boot·后端·ai