C++ stack和queue容器使用_C++栈与队列数据结构实战

14次阅读

c++中stack和queue是STL提供的容器适配器,分别用于实现后进先出(LIFO)和先进先出(FIFO)操作。stack支持push、pop、top等操作,常用于括号匹配等场景;queue提供front、back、push、pop等功能,适用于层序遍历(BFS)等应用。两者均需包含对应头文件并注意访问前判空,避免运行时错误。

C++ stack和queue容器使用_C++栈与队列数据结构实战

在C++中,stack)和queue(队列)是两种常用的数据结构,它们被包含在标准模板库(STL)中,分别定义于#include #include 头文件。虽然底层可以用vector、deque或list实现,但它们提供了一种更安全、更语义化的接口来处理“后进先出”和“先进先出”的逻辑。

stack 的基本使用

栈是一种后进先出(LIFO, Last In First Out)的数据结构。C++中的std::stack是一个容器适配器,它不支持遍历,只允许从一端(栈顶)进行操作。

常用操作包括:

  • push(element):将元素压入栈顶
  • pop():移除栈顶元素(不返回值)
  • top():获取栈顶元素的引用
  • empty():判断栈是否为空
  • size():返回栈中元素个数

示例代码:

立即学习C++免费学习笔记(深入)”;

#include 
#include int main() { std::stack s; s.push(10); s.push(20); s.push(30);
while (!s.empty()) {     std::cout zuojiankuohaophpcnzuojiankuohaophpcn s.top() zuojiankuohaophpcnzuojiankuohaophpcn " ";     s.pop(); } // 输出:30 20 10 return 0;

}

queue 队列的基本使用

队列遵循先进先出(FIFO, First In First Out)原则。C++中的std::queue也是容器适配器,默认基于deque实现。

主要操作有:

  • push(element):在队尾添加元素
  • pop():删除队首元素(不返回值)
  • front():访问队首元素
  • back():访问队尾元素
  • empty()size():与stack一致

示例代码:

立即学习C++免费学习笔记(深入)”;

#include 
#include int main() { std::queue q; q.push(10); q.push(20); q.push(30);
while (!q.empty()) {     std::cout zuojiankuohaophpcnzuojiankuohaophpcn q.front() zuojiankuohaophpcnzuojiankuohaophpcn " ";     q.pop(); } // 输出:10 20 30 return 0;

}

实战应用场景举例

stack和queue在算法题和系统设计中非常实用。

使用 stack 判断括号匹配

遍历字符串,遇到左括号入栈,右括号时检查栈顶是否匹配并弹出。

bool isValid(std::string s) {     std::stack st;     for (char c : s) {         if (c == '(' || c == '[' || c == '{') {             st.push(c);         } else {             if (st.empty()) return false;             if ((c == ')' && st.top() != '(') ||                 (c == ']' && st.top() != '[') ||                 (c == '}' && st.top() != '{')) {                 return false;             }             st.pop();         }     }     return st.empty(); }

使用 queue 实现层序遍历(BFS)

二叉树的广度优先搜索依赖队列保存待访问节点。

struct Treenode {     int val;     TreeNode *left, *right;     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; 

void bfs(TreeNode root) { if (!root) return; std::queue> q; q.push(root);

while (!q.empty()) {     TreeNode* node = q.front(); q.pop();     std::cout zuojiankuohaophpcnzuojiankuohaophpcn node-youjiankuohaophpcnval zuojiankuohaophpcnzuojiankuohaophpcn " ";      if (node-youjiankuohaophpcnleft)  q.push(node-youjiankuohaophpcnleft);     if (node-youjiankuohaophpcnright) q.push(node-youjiankuohaophpcnright); }

}

基本上就这些。掌握stack和queue的接口和典型用法,能显著提升编码效率,特别是在处理递归模拟、状态暂存、广度搜索等场景时。注意不要误用top()front()前未判空,否则会引发运行时错误。

text=ZqhQzanResources