C++ 11:栈(stack)——后进先出(LIFO)数据结构
栈stack是 C STL 中经典的后进先出LIFO, Last In First Out数据结构所有操作仅在一端栈顶进行。它封装了底层容器默认 deque提供稳定、高效的入栈、出栈等接口是解决括号匹配、表达式求值、函数调用栈等问题的核心工具。一、核心概念与原理1. 基本特性操作位置仅在栈顶top进行插入和删除。核心规则后进先出LIFO。最后插入的元素最先被移除。底层容器默认使用deque双端队列也可指定vector或list。不支持迭代器栈是容器适配器不支持随机访问只能通过接口操作。2. 关键操作成员函数功能push(值)入栈将元素添加到栈顶pop()出栈移除栈顶元素不返回值top()获取栈顶元素的引用size()返回栈中元素个数empty()判断栈是否为空为空返回trueswap()交换两个栈的内容C11 后常用二、定义与初始化使用栈必须包含头文件stack。定义时指定元素类型默认容器为deque。1. 基础语法#include stack // 必须包含头文件 // 格式: stack元素类型, 容器类型 栈名; stackint st1; // 最常用int类型默认deque容器 stackchar, vectorchar st2; // 指定vector作为底层容器 stackint, listint st3; // 指定list作为底层容器2. 快速初始化示例#include iostream #include stack using namespace std; int main() { // 1. 创建空栈 stackint st; // 2. 入栈操作 st.push(10); st.push(20); st.push(30); return 0; }三、常用操作实战代码#include iostream #include stack using namespace std; int main() { // 创建一个int类型的栈 stackint st; // 1. 判断栈是否为空 if (st.empty()) { cout s1是空的 endl; } // 2. 入栈操作 (0,1,2,3,4) for (int i 0; i 5; i) { st.push(i); } cout 入栈0~4后,栈内的数据个数: st.size() endl; // 3. 出栈操作 (输出栈顶并移除) cout 出栈: endl; while (!st.empty()) { // 输出栈顶元素 cout st.top() endl; // 移除栈顶元素 st.pop(); } return 0; }运行结果s1是空的 入栈0~4后,栈内的数据个数:5 出栈: 4 3 2 1 0四、底层容器与注意事项1. 为什么默认是deque高效的头尾操作deque在头部和尾部插入 / 删除效率极高。扩容成本低相比vector一次性扩容复制所有数据deque扩容更轻量。2. 可用容器限制可以作为栈底层容器的类型必须支持以下成员函数back()push_back()pop_back()empty()、size()结论✅可用deque默认、vector、list❌不可用forward_list不支持 back ()、array不支持动态扩容五、常见应用场景1. 括号匹配校验#include stack #include string bool isValidParentheses(string s) { stackchar st; for(char c : s) { if(c () st.push()); else if(c {) st.push(}); else if(c [) st.push(]); else if(st.empty() || st.top() ! c) return false; else st.pop(); } return st.empty(); }2. 逆序输出栈天然支持反转序列stackint st; st.push(1); st.push(2); st.push(3); while(!st.empty()) { cout st.top(); st.pop(); } // 输出 321六、核心总结核心口诀栈顶操作后进先出push 入pop 出top 取顶。使用规范包含头文件#include stack访问成员用.运算符如st.push()动态管理pop()只删除不返回需先top()取值再pop()。性能底层容器高效入栈 / 出操时间复杂度均为O(1)。