当我们学习了vector和list之后,要模拟实现栈和队列就太简单了,我们可以直接用vector或者list,直接调用它们的函数进行适配就可以。
一、栈
1、成员函数
namespace vae
{
//适配器模式
template<class T, class container = vector<T>>
class stack
{
public:
private:
container _str;
};
}
它的成员类型是一个模板,我们用的时候直接传一个vector或者list。
2、插入
void push(const T& val)
{
_str.push_back(val);
}
3、删除
void pop()
{
_str.pop_back();
}
4、数据个数
size_t size()
{
return _str.size();
}
5、判空
bool empty()
{
return _str.empty();
}
6、取栈顶元素
T& top()
{
return _str.back();
}
7、完整代码
#include<iostream>
#include<vector>
#include<list>
using namespace std;
namespace vae
{
template<class T, class container = vector<T>>//缺省值,也可以给list
class stack
{
public:
void push(const T& val)
{
_str.push_back(val);
}
void pop()
{
_str.pop_back();
}
T& top()
{
return _str.back();
}
size_t size()
{
return _str.size();
}
bool empty()
{
return _str.empty();
}
private:
container _str;
};
void test_stack()
{
stack<int> st;
st.push(1);
st.push(2);
st.push(3);
st.push(4);
st.push(5);
while (!st.empty())
{
cout << st.top() << " ";
st.pop();
}
cout << endl;
}
}
int main()
{
vae::test_stack();
return 0;
}
二、队列
队列最好用list适配,不是说vector不行,只是头删的话vector效率太低,不建议使用。
1、成员函数
//适配器模式
template<class T, class container = list<T>>
class queue
{
public:
private:
container _str;
};
2、插入
void push(const T& val)
{
_str.push_back(val);
}
3、删除
void pop()
{
_str.pop_front();
}
4、front
T& front()
{
return _str.front();
}
5、back
T& back()
{
return _str.back();
}
6、数据个数
size_t size()
{
return _str.size();
}
7、判空
bool empty()
{
return _str.empty();
}
8、完整代码
namespace vae
{
template<class T, class container = list<T>>
class queue
{
public:
void push(const T& val)
{
_str.push_back(val);
}
void pop()
{
_str.pop_front();
}
T& front()
{
return _str.front();
}
T& back()
{
return _str.back();
}
size_t size()
{
return _str.size();
}
bool empty()
{
return _str.empty();
}
private:
container _str;
};
void test_queue()
{
vae::queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);
while (!q.empty())
{
cout << q.front() << " ";
q.pop();
}
cout << endl;
}
}
int main()
{
vae::test_queue();
return 0;
}
三、总结
适配器模式是一种很牛的模式,我们可以根据我们想要的进行适配,但是不都是这么简单的,比如优先级队列,就不仅仅是适配,还要加一些东西。这个模式的本质我感觉就是复用。在栈和队列这里我们复用之后什么构造析构都不用管,因为vector、list有析构和构造函数,对应的功能我们调对应的函数即可,非常好用。