C++ stack (STL容器适配器)

浅浅的花香味﹌ 2023-06-08 03:19 197阅读 0赞

目录

适配器

stack

stack的使用

stack模拟实现


适配器

适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),适配器是将一个类的接口转换成客户希望的另外一个接口。

举个栗子, 咱们香港的插头和我们内地是不一的, 如下图, 这种插头在咱们内地是不方便使用的, 要是香港同胞到对岸深圳转一转, 被繁华的深圳所吸引, 不禁多留了两天, 那这时候手机要充电怎么充电啊, 不过没关系, 我们有适配器, 其实真正给手机充电的还是手机充电器, 适配器只是方便了人们的使用而已.

format_pngwatermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDcxMDY4_size_16_color_FFFFFF_t_70
港版充电器 适配器 适配器的使用

常见的容器适配器有stack , queue, priority_queue, 它们就相当于上图的适配器, 真正给手机充电的是还是充电头, 同样的道理, 它们底层是靠别的容器实现的
例如:
stack可以用vector, deque, list实现.
queue可以用 deque, list实现
priority_queue, 可以用 deque, vector实现

stack

  1. stack是一种容器适配器,专门用在具有后进先出操作的需求中,其删除只能从容器的一端进行元素的插入与提取操作。
  2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
  3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类必须支持以下操作
    empty:判空操作
    back:获取尾部元素操作
    push_back:尾部插入元素操作
    pop_back:尾部删除元素操作
  4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器,默认情况下使用deque。
  5. 需要头文件#include
  6. 为什么选择deque作为stack的底层默认容器
    主要原因
    deque优点: 两端插入删除最快的
    deque缺点: 迭代器复杂效率低
    stack利用了优点规避了缺点, 在末端插删, 且并未使用迭代器, 所以deque最优

stack图示 :
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDcxMDY4_size_16_color_FFFFFF_t_70 1

C++STL容器适配器之queue
C++ STL容器适配器之priority_queue

stack的使用


































函数名称 接口说明
stack()  构造空的栈
empty()  检测stack是否为空
size()  返回stack中元素的个数
top() 返回栈顶元素的引用
push() 将元素val压入stack中
pop()  将stack中栈顶的元素弹出

stack模拟实现

mystack.h

  1. #pragma once
  2. #include<deque>
  3. using namespace std;
  4. template<class T, class Con = deque<T>>
  5. class mystack {
  6. Con s;
  7. public:
  8. mystack() {
  9. }
  10. void push(const T& val) {
  11. s.push_back(val);
  12. }
  13. void pop() {
  14. s.pop_back();
  15. }
  16. T& top() {
  17. return s.back();
  18. }
  19. int size() {
  20. return s.size();
  21. }
  22. bool empty() {
  23. return s.empty();
  24. }
  25. };

测试入口main.cpp

  1. #include<iostream>
  2. #include<stack>
  3. #include<deque>
  4. #include<list>
  5. #include<vector>
  6. #include"mystack.h"
  7. using namespace std;
  8. void Test_stack() {
  9. cout << "STL中的stack\n";
  10. stack<int, deque<int>> s;
  11. for (int i = 1; i <= 5; ++i) {
  12. s.push(i);
  13. }
  14. cout << "size = " << s.size() << endl;
  15. while (!s.empty()) {
  16. cout << s.top() << endl;
  17. s.pop();
  18. }
  19. cout << "size = " << s.size() << endl;
  20. }
  21. void Test_mystack() {
  22. cout << "自己实现的的stack\n";
  23. mystack<int> s;
  24. //mystack<int, list<int>> s;
  25. //mystack<int, vector<int>> s;
  26. for (int i = 1; i <= 5; ++i) {
  27. s.push(i);
  28. }
  29. cout << "size = " << s.size() << endl;
  30. while (!s.empty()) {
  31. cout << s.top() << endl;
  32. s.pop();
  33. }
  34. cout << "size = " << s.size() << endl;
  35. }
  36. int main() {
  37. Test_stack();
  38. Test_mystack();
  39. system("pause");
  40. return 0;
  41. }

运行结果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDcxMDY4_size_16_color_FFFFFF_t_70 2

发表评论

表情:
评论列表 (有 0 条评论,197人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ stack(STL stack)

    容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。 sta

    相关 518-C++STL(容器适配器)

    C++STL(容器适配器) 标准容器 - 容器适配器 => 我们有一种设计模式,就叫做适配器模式 stack容器适配器相当于就是栈把deque代理了一下 怎么理解这个