目录
什么是适配器
模拟实现stack
stack的特性
STL中stack的基本框架
接口实现
模拟实现queue
queue的特性
STL中queue的框架
什么是适配器
适配器:所谓适配,适配的是容器(vector,list,deque....)
也就是不管是什么容器,都可以套用适配器,正因如此,所以我们在编写适配器时需要一个模板参数来接收容器
模拟实现stack
stack的特性
stack:栈,具有后进先出的特性
我们可以把栈看成一个桶,我们往这个桶里放了许多的东西,当我们要取最底下的东西时,要把桶顶上的物品先拿走,如果脱离了这个性质那么这个就不是桶了
同样的如果我们要取栈底的数据时,我们需要先取出压住这个数据的数据
栈的插入和删除只能在一端进行,我们把这一端叫做栈顶
我们依次往里面插入一些数据试试,依次插入:1,2,3,4,5,6
插入后如图
此时如果我们要取出最底下的1,就需要把上面的6,5,4,3,2都移走
STL中stack的基本框架
在STL中,stack是一个适配器,也就是无论我们使用list还是vector不管使用什么容器,只要能符合栈的性质,就是一个栈
注意:需要容器支持stack所调用的那些接口才可以
STL中,在模板中加入了一个模板参数为容器模板(container)
通常我们都把stack的模板容器的缺省值设置为deque,原因是deque尾插尾删效率都很高,并且deque的空间浪费不会太大
deque的具体介绍
template<class T,class Container = deque<int>>
class stack
{
public:
//接口实现
private:
Container _con;
};
且stack的构造/析构函数不需要显示写,会自动调用容器的构造/析构函数
接口实现
stack的接口都是复用容器的接口
template<class T , class Container = deque<int>>
class stack
{
public:
bool empty() const//判空
{
return _con.empty();
}
size_t size() const//返回大小
{
return _con.size();
}
T& top()//返回栈顶的数据,也就是最近一次插入的数据
{
return _con.back()
}
const T& top()const
{
return _con.back();
}
void push (const T& x)//插入从尾部插入对于所有容器都支持
{
_con.push_back(x)
}
void pop()
{
_con.pop_back();//尾上插入的就尾删,栈只支持一端插入删除
}
private:
Container _con;
};
模拟实现queue
queue的特性
queue我们一般叫做队列,它具有先进先出的性质
如图
通常
我们把插入的一端叫做队尾
删除的一端叫做队头
如果我们依次插入一段数据,1、2、3、4、5、6、7
那么此时删除的顺序就是:1,2,3,4,5,6,7依次删除
STL中queue的框架
queue跟stack一样也是容器适配器,那么就需要有一个容器模板参数
template<class T,class Container = deque<int>>
class queue
{
public:
//接口实现
private:
Container _con;
};
注意:队列的容器不能使用vector,原因是队列是需要进行头删的,但vector没有头删
接口实现
template<class T,class Container = deque<int>>
class queue
{
public:
//队尾插入
void push(const T& x)
{
_con.push_back();
}
//队尾删除
void pop()
{
_con.pop_back();
}
//判空
bool empty()
{
return _con.empty();
}
size_t size()
{
return _con.size();
}
//队头数据
const T& front()
{
return _con.front();
}
T& front()
{
return _con.front();
}
//队尾数据
const T& back()
{
return _con.back();
}
T& back()
{
return _con.back();
}
private:
Container _con;
};
这期内容比较少,因为只讲了干货,那这期就到这了,感谢大家的支持