【C++】---STL容器适配器之stack
一、什么是适配器?
(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
好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!