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

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

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

stack 栈的基本使用

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

常用操作包括:

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

示例代码:

#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一致

示例代码:

#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()前未判空,否则会引发运行时错误。