• C++ 学习系列 -- std::stack 与 std::queue


    一  std::stack 与 std::queue 分别是什么?

     两者均是 c++ 中的序列化容器,区别在于:

     std::stack   元素是先进后出

     std::queue 元素是先进先出

    二  std::stack 与 std::queue 原理

    1 std:statck

    2. std::queue

    两者底层容器可以是 list 也可以是 deque ;

    为了保证 两个序列式容器的特点, 两者均不支持遍历,也不支持迭代器。

    三  常见函数接口与使用

    1.  std::stack

    1.1 构造函数

    std::stack::stack - cppreference.com

    函数说明
    stack()空构造函数

    1.2  容器修改

                  

    函数说明
    push在栈顶 放入元素
    emplace在栈顶 放入元素,也可以放入元素类的参数,实现原地构造
    pop弹出栈顶元素

    1.3 容器访问

    函数说明
    top返回栈顶元素的引用

    1.4 容器空间

    函数说明
    empty判断栈是否为空
    size返回栈中元素个数

    代码如下:

    1. #include
    2. #include
    3. int main()
    4. {
    5. // 1. constructor
    6. std::stack<int> tmp_stack;
    7. // 2. Modifiers
    8. tmp_stack.push(1);
    9. tmp_stack.push(2);
    10. tmp_stack.push(3);
    11. tmp_stack.push(3);
    12. tmp_stack.pop();
    13. tmp_stack.emplace(4);
    14. tmp_stack.emplace(5);
    15. // 3. Element access
    16. std::cout << tmp_stack.top() << std::endl;
    17. std::cout << "------" << std::endl;
    18. // 4. Capacity
    19. std::cout << tmp_stack.empty() << std::endl;
    20. std::cout << tmp_stack.size() << std::endl;
    21. std::cout << "------" << std::endl;
    22. while (!tmp_stack.empty()) {
    23. std::cout << tmp_stack.top() << " ";
    24. tmp_stack.pop();
    25. }
    26. return 0;
    27. }

    2. std::queue

    1.1 构造函数

       https://en.cppreference.com/w/cpp/container/queue/queue

    函数说明
    queue空构造函数

    1.2  容器修改

    函数说明
    push在队尾放入元素
    emplace在队尾 放入元素,也可以放入元素类的参数,实现原地构造
    pop弹出队首元素

    1.3 容器访问

    函数说明
    front返回队首元素的引用
    back返回队尾元素的引用

    1.4 容器空间

    函数说明
    empty判断queue 是否为空
    size返回queue中元素个数

       代码:

      

    1. #include
    2. #include
    3. int main()
    4. {
    5. // 1. constructor
    6. std::queue<int> tmp_queue;
    7. // 2. Modifiers
    8. tmp_queue.push(1);
    9. tmp_queue.push(2);
    10. tmp_queue.push(3);
    11. tmp_queue.push(3);
    12. tmp_queue.pop();
    13. tmp_queue.emplace(4);
    14. tmp_queue.emplace(5);
    15. // 3. Element access
    16. std::cout << tmp_queue.front() << std::endl;
    17. std::cout << tmp_queue.back() << std::endl;
    18. std::cout << "------" << std::endl;
    19. // 4. Capacity
    20. std::cout << tmp_queue.empty() << std::endl;
    21. std::cout << tmp_queue.size() << std::endl;
    22. std::cout << "------" << std::endl;
    23. while (!tmp_queue.empty()) {
    24. std::cout << tmp_queue.front() << " ";
    25. tmp_queue.pop();
    26. }

      输出:

       

    四  简单实现

    下面代码中的 my_deque.h 为 这个博客中实现的 my_deque

    C++ -- 学习系列 std::deque 的原理与使用-CSDN博客

    1. my_stack

    1. // my_stack.h
    2. #include"my_deque.h"
    3. template<typename T>
    4. class my_stack
    5. {
    6. public:
    7. my_stack()
    8. {
    9. }
    10. ~my_stack()
    11. {
    12. }
    13. void push(T& val)
    14. {
    15. data.push_back(val);
    16. }
    17. void push(T&& val)
    18. {
    19. data.push_back(val);
    20. }
    21. T& top()
    22. {
    23. return data.back();
    24. }
    25. void pop()
    26. {
    27. data.pop_back();
    28. }
    29. int size()
    30. {
    31. return data.size();
    32. }
    33. bool empty()
    34. {
    35. return data.empty();
    36. }
    37. private:
    38. my_deque16> data;
    39. };
    40. // main.cpp
    41. int main()
    42. {
    43. // 1. constructor
    44. std::stack<int> tmp_stack;
    45. // 2. Modifiers
    46. tmp_stack.push(1);
    47. tmp_stack.push(2);
    48. tmp_stack.push(3);
    49. tmp_stack.push(3);
    50. tmp_stack.pop();
    51. tmp_stack.emplace(4);
    52. tmp_stack.emplace(5);
    53. // 3. Element access
    54. std::cout << tmp_stack.top() << std::endl;
    55. std::cout << "------" << std::endl;
    56. // 4. Capacity
    57. std::cout << tmp_stack.empty() << std::endl;
    58. std::cout << tmp_stack.size() << std::endl;
    59. std::cout << "------" << std::endl;
    60. while (!tmp_stack.empty()) {
    61. std::cout << tmp_stack.top() << " ";
    62. tmp_stack.pop();
    63. }
    64. return 0;
    65. }

    输出:

      

    2. my_queue

    1. // my_queue.h
    2. #include"my_deque.h"
    3. template<typename T>
    4. class my_queue
    5. {
    6. public:
    7. my_queue()
    8. {
    9. }
    10. ~my_queue()
    11. {
    12. }
    13. void push(T& val)
    14. {
    15. data.push_back(val);
    16. }
    17. void push(T&& val)
    18. {
    19. data.push_back(val);
    20. }
    21. void pop()
    22. {
    23. data.pop_front();
    24. }
    25. T& front()
    26. {
    27. return data.front();
    28. }
    29. T& back()
    30. {
    31. return data.back();
    32. }
    33. bool empty()
    34. {
    35. return data.empty();
    36. }
    37. int size()
    38. {
    39. return data.size();
    40. }
    41. private:
    42. my_deque16> data;
    43. };
    44. // main.cpp
    45. int main()
    46. {
    47. // 1. constructor
    48. my_queue<int> tmp_queue;
    49. // 2. Modifiers
    50. tmp_queue.push(1);
    51. tmp_queue.push(2);
    52. tmp_queue.push(3);
    53. tmp_queue.push(3);
    54. tmp_queue.pop();
    55. // 3. Element access
    56. std::cout << tmp_queue.front() << std::endl;
    57. std::cout << tmp_queue.back() << std::endl;
    58. std::cout << "------" << std::endl;
    59. // 4. Capacity
    60. std::cout << tmp_queue.empty() << std::endl;
    61. std::cout << tmp_queue.size() << std::endl;
    62. std::cout << "------" << std::endl;
    63. while (!tmp_queue.empty()) {
    64. std::cout << tmp_queue.front() << " ";
    65. tmp_queue.pop();
    66. }
    67. return 0;
    68. }

     输出:

  • 相关阅读:
    工程化专栏目录
    万能险生存金什么意思,一文告诉你!
    站在健康保障行业拐点,轻松集团如何“无界开元”?
    Linux定时任务切割日志
    docker 安装redis(最新版)
    從turtle海龜動畫 學習 Python - 高中彈性課程系列 10.2 藝術畫 Python 製作生成式藝術略覽
    数据挖掘十大算法
    Vite - 配置 - 自动修改 index.html 中的title
    java毕业设计仓库管理系统mybatis+源码+调试部署+系统+数据库+lw
    Unity - Shader Compiled Log
  • 原文地址:https://blog.csdn.net/qq_33775774/article/details/133466569