首先,我们用传统写法来实现栈:
如下:
#pragma once
#include <assert.h>
#include <string.h>
namespace cx
{
//传统写法:
template <class T>
class stack
{
public:
stack()
{
_a = nullptr;
_top = _capacity = 0;
}
~stack()
{
delete[] _a;
_a = nullptr;
_top = _capacity = 0;
}
bool empty()const
{
return _top == 0;
}
size_t size()const
{
return _top;
}
T& top()
{
assert(_top > 0);
return *(_a + _top-1);
}
const T& top() const
{
assert(_top > 0);
return *(_a + _top);
}
void push(const T& val)
{
if (_top == _capacity)
{
size_t newcapacity = _capacity == 0 ? 4 : 2 * _capacity;
T* tmp = new T[newcapacity];
memcpy(tmp, _a,sizeof(T)*_top);
delete[] _a;
_a = tmp;
_capacity = newcapacity;
}
*(_a + _top) = val;
_top++;
}
void pop()
{
assert(_top > 0);
_top--;
}
private:
T* _a;
size_t _top;
size_t _capacity;
};
}
我们实现的是顺序表栈,但是如果我们用适配器写法,如下:
#pragma once
#include <string.h>
#include <deque>
namespace cx
{
//现代写法:适配器版本:
template<class T, class container = deque<T>>
class stack
{
public:
const T& top()
{
return _con.back();
}
void pop()
{
_con.pop_back();
}
void push(const T& val)
{
_con.push_back(val);
}
size_t size() const
{
return _con.size();
}
bool empty() const
{
return _con.empty();
}
private:
container _con;
};
}
如果你没看懂,看下面我们测试方法:
#include <iostream>
#include <vector>
using namespace std;
#include "stack.h"
void test_1()
{
cx::stack<int,vector<int>> _st;
_st.push(1);
_st.push(2);
_st.push(3);
_st.push(4);
_st.push(5);
_st.push(6);
while (!_st.empty())
{
std::cout << _st.top() << " ";
_st.pop();
}
std::cout<<std::endl;
}
int main()
{
test_1();
return 0;
}
此时我们用vector来作容器,但是我们可不可以用list来呢?肯定可以,如下:
#include <iostream>
#include <vector>
#include <list>
using namespace std;
#include "stack.h"
void test_1()
{
//cx::stack<int,vector<int>> _st;
cx::stack<int, list<int>> _st;
_st.push(1);
_st.push(2);
_st.push(3);
_st.push(4);
_st.push(5);
_st.push(6);
while (!_st.empty())
{
std::cout << _st.top() << " ";
_st.pop();
}
std::cout<<std::endl;
}
int main()
{
test_1();
return 0;
}
此时就是list,注意的是:我们默认是deque!!!
这就是stack的对比实现,希望大家有所收获!!!