C++标准库中的Stack(堆栈)和Queue(队列)详解

 更新时间:2025年10月28日 10:10:49   作者:m0_74824025  
在C++标准模板库(STL)中,stack和queue是两种非常重要的容器适配器,这篇文章主要介绍了C++标准库中Stack(堆栈)和Queue(队列)的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

1. stack(栈)

核心概念

栈是一种 LIFO 的数据结构。

  • LIFO: Last-In, First-Out,即后进先出。

  • 想象一叠盘子:你总是从最上面取走盘子,新盘子也总是放在最上面。

头文件

cpp

#include <stack>

底层容器

默认情况下,stack 使用 deque 作为其底层容器。但你也可以显式指定使用 vector 或 list

cpp

stack<int> s1; // 默认使用 deque
stack<int, vector<int>> s2; // 使用 vector 作为底层容器
stack<int, list<int>> s3; // 使用 list 作为底层容器

主要成员函数

函数功能时间复杂度
push(const T& value)将元素压入栈顶O(1)
pop()弹出栈顶元素O(1)
top()返回栈顶元素的引用O(1)
empty()检查栈是否为空O(1)
size()返回栈中元素的数量O(1)

注意stack 没有提供 begin() 和 end() 方法,因此不能使用范围 for 循环来遍历。遍历栈的唯一方式是不断弹出其元素。

基本用法示例

cpp

#include <iostream>
#include <stack>
using namespace std;

int main() {
    stack<int> s;

    // 压入元素
    s.push(10);
    s.push(20);
    s.push(30);

    // 查看栈顶元素
    cout << "Top element: " << s.top() << endl; // 输出 30

    // 弹出栈顶元素
    s.pop(); // 弹出 30
    cout << "Top after pop: " << s.top() << endl; // 输出 20

    // 遍历栈 (会销毁栈)
    cout << "Stack elements: ";
    while (!s.empty()) {
        cout << s.top() << " ";
        s.pop();

    }
    // 输出:Stack elements: 20 10
    cout << endl;

    return 0;
}

2. queue(队列)

核心概念

队列是一种 FIFO 的数据结构。

  • FIFO: First-In, First-Out,即先进先出。

  • 想象排队买票:先来的人先买到票离开,新来的人排在队伍末尾。

头文件

cpp

#include <queue>

底层容器

默认情况下,queue 使用 deque 作为其底层容器。你也可以指定使用 list(但不能用 vector,因为 vector 没有 pop_front 方法)。

cpp

queue<int> q1; // 默认使用 deque
queue<int, list<int>> q2; // 使用 list 作为底层容器

主要成员函数

函数功能时间复杂度
push(const T& value)将元素添加到队尾O(1)
pop()移除队首元素O(1)
front()返回队首元素的引用O(1)
back()返回队尾元素的引用O(1)
empty()检查队列是否为空O(1)
size()返回队列中元素的数量O(1)

注意:和 stack 一样,queue 也没有迭代器,不能使用范围 for 循环遍历。

基本用法示例

cpp

#include <iostream>
#include <queue>
using namespace std;

int main() {
    queue<int> q;

    // 添加元素到队尾
    q.push(10);
    q.push(20);
    q.push(30);

    // 查看队首和队尾元素
    cout << "Front element: " << q.front() << endl; // 输出 10
    cout << "Back element: " << q.back() << endl;  // 输出 30

    // 移除队首元素
    q.pop(); // 移除 10
    cout << "Front after pop: " << q.front() << endl; // 输出 20

    // 遍历队列 (会销毁队列)
    cout << "Queue elements: ";
    while (!q.empty()) {
        cout << q.front() << " ";
        q.pop();

    }
    // 输出:Queue elements: 20 30
    cout << endl;

    return 0;
}

关键区别总结

特性stack (栈)queue (队列)
数据原则LIFO (后进先出)FIFO (先进先出)
核心操作push()pop()top()push()pop()front()back()
访问元素只能访问栈顶 (top)可以访问队首 (front) 和队尾 (back)
典型应用函数调用栈、表达式求值、撤销操作消息队列、CPU 任务调度、广度优先搜索

进阶:自定义底层容器与使用场景

为什么 stack 可以用 vector,而 queue 不行?

  • stack 只需要在一端进行操作(push_backpop_back),vector 完美支持,且效率很高。

  • queue 需要在两端进行操作(push_backpop_front)。vector 没有 pop_front() 方法,如果用它会导致效率极低的 O(n) 操作(需要移动所有元素),所以标准库禁止了这种用法。

如何选择底层容器?

  • 默认 deque:在大多数情况下是最平衡的选择,两端操作效率都高。

  • stack 用 vector:如果你确定你的栈操作非常密集,且内存分配性能至关重要,vector 可能稍快一些,因为它使用连续内存。

  • list:如果你需要稳定的迭代器(在元素插入删除时不会失效),或者你的元素非常大,移动成本高,可以考虑 list

cpp

// 一个使用 vector 作为底层容器的栈
stack<int, vector<int>> my_stack;

// 一个使用 list 作为底层容器的队列
queue<int, list<int>> my_queue;

总结

stack 和 queue 是 C++ 中两个简单而强大的容器适配器,它们通过限制对底层数据的访问方式,强制实现了特定的数据管理规则。理解它们的 LIFO 和 FIFO 原则是正确使用的关键。它们被广泛应用于各种算法和系统设计中。

到此这篇关于C++标准库中的Stack(堆栈)和Queue(队列)的文章就介绍到这了,更多相关C++标准库stack和queue内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现实时钟表

    C语言实现实时钟表

    这篇文章主要为大家详细介绍了C语言实现实时钟表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • C++中的变长参数深入理解

    C++中的变长参数深入理解

    变长参数的函数,即参数个数可变、参数类型不定的函数。设计一个参数个数可变、参数类型不定的函数是可能的,最常见的例子是printf函数、scanf函数和高级语言的Format函数。最近的一个项目中就遇到这么一个相关的问题,感兴趣的朋友们下面来一起看看吧。
    2016-10-10
  • C++实现LeetCode(146.近最少使用页面置换缓存器)

    C++实现LeetCode(146.近最少使用页面置换缓存器)

    这篇文章主要介绍了C++实现LeetCode(146.近最少使用页面置换缓存器),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言实现简单停车场管理系统

    C语言实现简单停车场管理系统

    这篇文章主要为大家详细介绍了C语言实现简单停车场管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C++指针数组、数组指针、数组名及二维数组技巧汇总

    C++指针数组、数组指针、数组名及二维数组技巧汇总

    这篇文章主要介绍了C++指针数组、数组指针、数组名及二维数组技巧汇总,对于深入理解C++数组与指针来说非常重要,需要的朋友可以参考下
    2014-08-08
  • C语言中const与指针使用方法总结

    C语言中const与指针使用方法总结

    这篇文章主要介绍了C语言中const与指针使用方法总结的相关资料,需要的朋友可以参考下
    2017-10-10
  • C++关于引用作为函数的用法

    C++关于引用作为函数的用法

    今天小编就为大家分享一篇关于C++关于引用作为函数的用法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C++中浮点数、double类型如何与0值作比较详解

    C++中浮点数、double类型如何与0值作比较详解

    浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数,这篇文章主要介绍了C++中浮点数、double类型如何与0值作比较的相关资料,需要的朋友可以参考下
    2025-03-03
  • C语言链表实现简单图书管理系统

    C语言链表实现简单图书管理系统

    这篇文章主要为大家详细介绍了C语言链表实现简单图书管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++实现趣味扫雷游戏

    C++实现趣味扫雷游戏

    这篇文章主要为大家详细介绍了C++实现趣味扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06

最新评论