跳转到内容

C++stac

来自代码酷

模板:Note

C++ stack容器[编辑 | 编辑源代码]

stack是C++标准模板库(STL)中的一种容器适配器,它基于其他容器(如dequelist)实现,遵循后进先出(LIFO)原则。stack不提供迭代器,仅允许在容器顶部进行插入和删除操作。

基本特性[编辑 | 编辑源代码]

  • 时间复杂度:所有操作均为O(1)
  • 底层容器:默认使用deque,也可指定vectorlist
  • 头文件<stack>

成员函数[编辑 | 编辑源代码]

函数 描述
push() 在栈顶插入元素
pop() 移除栈顶元素(不返回)
top() 返回栈顶元素引用
empty() 检查栈是否为空
size() 返回元素数量

代码示例[编辑 | 编辑源代码]

基础用法[编辑 | 编辑源代码]

#include <iostream>
#include <stack>

int main() {
    std::stack<int> s;

    // 压栈操作
    s.push(10);
    s.push(20);
    s.push(30);

    // 查看栈顶
    std::cout << "Top element: " << s.top() << "\n";

    // 弹栈操作
    s.pop();
    std::cout << "After pop, top element: " << s.top() << "\n";

    // 遍历栈(通过清空方式)
    std::cout << "Stack elements: ";
    while (!s.empty()) {
        std::cout << s.top() << " ";
        s.pop();
    }
    return 0;
}

输出结果:

Top element: 30
After pop, top element: 20
Stack elements: 20 10

自定义底层容器[编辑 | 编辑源代码]

#include <stack>
#include <vector>

int main() {
    // 使用vector作为底层容器
    std::stack<int, std::vector<int>> v_stack;
    v_stack.push(5);
    v_stack.push(10);
    // ...其他操作相同
}

实际应用案例[编辑 | 编辑源代码]

括号匹配检查[编辑 | 编辑源代码]

#include <stack>
#include <string>

bool isBalanced(const std::string& expr) {
    std::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();
}

浏览器历史记录[编辑 | 编辑源代码]

graph LR A[访问页面A] --> B[访问页面B] B --> C[访问页面C] C --> D[点击后退按钮] D --> E[显示页面B]

数学表示[编辑 | 编辑源代码]

栈操作可以形式化为:

  • 初始化:S=
  • 压栈:S=S{x}
  • 弹栈:x=top(S),S=S{x}

常见问题[编辑 | 编辑源代码]

为什么stack没有迭代器?[编辑 | 编辑源代码]

由于LIFO原则的限制,直接访问非栈顶元素会破坏栈的设计初衷。如需遍历,可临时复制到其他容器。

如何清空stack?[编辑 | 编辑源代码]

两种方法:

// 方法1:循环pop
while (!s.empty()) s.pop();

// 方法2:与空栈交换
std::stack<int>().swap(s);

性能考虑[编辑 | 编辑源代码]

  • 默认使用deque作为底层容器时,内存分配比vector更高效
  • 对于极端性能场景,可测试不同底层容器的表现

模板:Tip