前言
栈和队列这一块其实有数据结构的基础,学起来非常简单。
stack
栈的成员函数就这么写,除了emplace其他都已经非常熟悉了。
stack没有迭代器吗?
没有,因为栈已经不是容器了,它是容器适配器。给它一个迭代器还能保证先进先出这些吗?不能。
stack跟我们之前学的list其实很不太一样。
模板参数不同。
先快速用一下stack,让它跑起来。
void test_stack()
{
stack<int> st;
st.push(1);
st.push(2);
st.push(3);
st.push(4);
while (!st.empty())
{
cout << st.top() << " ";
st.pop();
}
cout << endl;
}
stack的模拟实现
栈的实现有两种方式。
1.数组栈,尾部当作栈顶。
2.链表栈,头部当作栈顶。
数组栈更有优势一点。
传统的写法,无非就是搞一个数组,不够了就扩容。
我们这里用一个适配器模式。
适配器的本质是什么?
现实生活中,我们的充电头也叫电源适配器。电源适配器是干嘛的?是生产电源的吗?
其实是用来变压的。
所以适配器的本质是用来转换的,把原来的东西给转换过来。
容器适配器,它不是自己存储数据,它是把已有的东西进行转换。
我们要实现一个顺序栈,链表栈,我们需要自己写吗?
我们可以拿一个已有的容器封装,这样写起来更简单。
为什么叫适配模式呢?
总结出来写代码的固定方式。
那怎么实现呢?
我们实现一个数组栈,链式栈,我们可以拿已有的容器封装,这样写起来更简单
但是上面这还不是适配,还要可以转换。
所以是这样写的,再增加一个模板参数,Container,他具体是啥我也不知道,但是它肯定是符合我们要求的容器。
要实现顺序栈,传vector.
要实现链表栈,传list.
namespace but
{
template<class T, class Container>
class stack
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
const T& top()
{
return _con.