【C++】---STL容器适配器之stack
- 一、什么是适配器?
- 二、栈
- 1、栈的性质
- 2、栈类
- (1)栈的构造
- (2)empty()
- (3)push()
- (4)pop()
- (5)top()
- (6)size()
- 三、栈的模拟
- 1、头文件(底层:vector)
- 2、测试文件
- 3、底层也可以为:list
一、什么是适配器?
(1)适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个 类的接口 转换成客户希望的另外一个接口。
(2)举个例子:比如对于笔记本来说,电源额定电压是220V,而美国电压是110V,为了能在美国使用,必须要用变压器转换电压以匹配美国电压,那么这个变压器就是个适配器。
为什么stack和queue不是容器?而叫做容器适配器???
(3)虽然stack和queue中也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器适配器,这是因为stack和queue只是对其他容器的接口进行了包装,STL中stack和queue默认使用deque。
二、栈
1、栈的性质
(1)在C++中,栈被叫做:容器适配器。栈的特性就是:后进先出,只能从容器的一端进行插入、提取、删除元素。
(2) stack是作为容器适配器被实现的,容器适配器即是对特定类封装将其作为底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层,元素从特定容器的尾部(即栈顶)被压入和弹出。
(3)栈的底层可以是任何标准容器的类模板,或者一些其他的特定容器类。
支持以下操作:
- empty()判空操作
- back()获取尾部元素
- push_back()尾插
- pop_back()尾删
2、栈类
(1)栈的构造
int main()
{stack<int> st1;return 0;
}
(2)empty()
int main()
{stack<int> st1;cout << st1.empty() << endl;return 0;
}
(3)push()
stack<int> st1;st1.push(1);st1.push(2);st1.push(3);st1.push(4);st1.push(5);
(4)pop()
while (!st1.empty()){cout << st1.top() << " ";st1.pop();}
(5)top()
int main()
{stack<int> st1;st1.push(1);st1.push(2);st1.push(3);st1.push(4);st1.push(5);while (!st1.empty()){cout << st1.top() << " ";st1.pop();}cout << endl;return 0;
}
(6)size()
int main()
{stack<int> st1;st1.push(1);st1.push(2);st1.push(3);st1.push(4);st1.push(5);cout << st1.size() << endl;return 0;
}
三、栈的模拟
注意:栈作为容器适配器、不像string vector list一样是一种完整的容器类。栈不是完整的容器类,而是提供接口的类(相当于在完整容器内的外面包装了一层)它的底层可以用vector实现,也可以用list实现。
栈的构造函数、拷贝构造函数、赋值运算符载函数、析构函数不需要写,会调用vector自己的默认构造函数、拷贝构造函数、赋值运算符重载函数、析构函数。
1、头文件(底层:vector)
#pragma once
#include<iostream>
#include<vector>
#include<list>using namespace std;namespace yjl
{template<class T ,class Container=std::vector<T>>class stack{private:Container _con;public:void push(const T& val){_con.push_back(val);}void pop(){_con.pop_back();}T top(){return _con.back();}size_t size(){return _con.size();}bool empty(){return _con.empty();}};
}
2、测试文件
#include"stack.h"void test_stack()
{yjl::stack<int> st;st.push(1);st.push(2);st.push(3);st.push(4);st.push(5);cout << st.size() << endl;while (!st.empty()){cout << st.top() << " ";st.pop();}cout << endl;
}int main()
{test_stack();return 0;
}
3、底层也可以为:list
好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!