前面我们讲过用模板实现顺序表的代码实现
模板顺序表
而实际应用中,我们常需要将一种接口转换为用户所需要的另一种接口,这就要用到C++中的适配器,对原本的程序进行一层包装。栈就是其中的一种。
栈遵循后进先出的规则,其插入和删除都是在栈顶操作,是一种特殊的线性顺序表,因此,实现栈我们通常建立在顺序表的基础上。srack不允许遍历,也不提供迭代器。
下面是栈的代码实现:
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
#include<string>
using namespace std;
template<class T>
class Vector
{
public:
Vector()
:_a(NULL)
, _size()
, _capacity(){}
~Vector()
{
if (_a)
{
delete [] _a;
_a = NULL;
_size = 0;
_capacity = 0;
}
}
void PushBack(const T& x)
{
Checkcapacity();
_a[_size] = x;
_size++;
}
void PopBack()
{
_size--;
}
void PopFront()
{
for (size_t i = 0; i < _size; i++)
{
_a[i] = _a[i + 1];
}
_size--;
}
bool Empty()
{
return (_size == 0);
}
T& Back()
{
return _a[_size - 1];
}
void Checkcapacity()
{
if (_size == _capacity)
{
size_t newcapacity = _capacity * 2 + 3;
T* tmp = new T[newcapacity];
if (_a)
{
for (size_t i = 0; i < _size; i++)
{
tmp[i] = _a[i];
}
}
delete[] _a;
_a = tmp;
_capacity = newcapacity;
}
}
void Print()
{
for (size_t i = 0; i < _size; i++)
{
cout << _a[i] << " ";
}
cout << endl;
}
protected:
T* _a;
size_t _size;
size_t _capacity;
};
void Funtest()
{
Vector<int> v;
v.PushBack(1);
v.PushBack(2);
v.PushBack(3);
v.PushBack(4);
v.Print();
Vector<string> v1;
v1.PushBack("11");
v1.PushBack("22");
v1.PushBack("33");
v1.PushBack("44");
v1.Print();
}
template<class T,class Container>//适配器
class Stack
{
public:
void Push(const T& x)
{
_con.PushBack(x);
}
void Pop()
{
_con.PopBack();
}
T& Top()
{
return _con.Back();
}
size_t Size()
{
return _con.Size();
}
bool Empty()
{
return _con.Empty();
}
protected:
Container _con;
};
void Teststack()
{
Stack<int,Vector<int>> s;
s.Push(1);
s.Push(2);
s.Push(3);
while (!s.Empty())
{
cout << s.Top() << " ";
s.Pop();
}
cout << endl;
}
int main()
{
//Funtest();
Teststack();
system("pause\n");
return 0;
}
执行结果如下:

被折叠的 条评论
为什么被折叠?



