探索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.最小栈)来巩固学习成果。

相关推荐
handler011 天前
算法:图的基本概念
c语言·开发语言·c++·笔记·算法·图论
超级无敌葛大侠1 天前
Redis里RDB和AOF的区别
java·redis
YJlio1 天前
《Windows Internals》10.5.1 ETW 概述:看懂 Windows 的“事件高速公路”
java·windows·笔记·stm32·嵌入式硬件·学习·eclipse
科技苑1 天前
C++ 与 QML 交互入门“陷阱”全解析
c++
木木_王1 天前
嵌入式Linux学习 | 数据结构 (Day03)顺序表与单链表 超详细解析(含 C 语言实现 + 作业 + 避坑指南)
linux·c语言·数据结构·学习
budingxiaomoli1 天前
SpringCloud概述
java·spring cloud·微服务
绿草在线1 天前
基于SpringBoot4+Mybatis+Thymeleaf的用户管理系统开发实战
java·spring boot·thymeleaf
承渊政道1 天前
【动态规划算法】(子序列问题解题框架与典型案例)
数据结构·c++·学习·算法·leetcode·macos·动态规划
鸟儿不吃草1 天前
Android Java 自定义TextView点击取词,类似百度翻译的点击一段英文中的某个单词,可以显示点击了哪个单词
android·java·开发语言
_F_y1 天前
仿RabbitMQ实现消息队列-服务端核心模块实现(3)
c++·算法·rabbitmq