stack模拟实现
我们用适配器模式/配接器模式,本源是转换,把已有的东西进行转换。
设计模式:把常见的设计方法进行总结,适配器也是一种设计模式。
我们用已有的容器封装:可以这样定义类模板template<class T,class Container>
,Container就是符合我们要求的一个容器。
我们可以将头文件写在.cpp文件中然后再包含,可以不在自定义头文件中写。
#pragma once
namespace Niu {
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.back();//不能用[],不是所有容器都有[]
}
bool size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
private:
//vector<int> v;
Container _con;
};
void test_stack()
{
stack<int, vector<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;
}
}
测试文件:
#include <stack>
#include <iostream>
#include <vector>
using namespace std;
#include "stack.h"
int main()
{
Niu::test_stack();
return 0;
}
我们也可以使用链式栈,直接定义:
stack<int, list<int>> st
模板参数的名字可以随便取。
我们也可以给模板参数一个缺省值,只不过给的是类型:template<class T,class Container = vector<int>>
给了缺省值之后我们就可以这样写stack<int> st
。必须从右往左缺省。如果不从右往左,可能会引起错误。