用多态实现线性表(队列,串,堆栈),要求具备线性表的基本操作:插入,删除,测长等。(程序员面试宝典例题)
#include <iostream>
//#include<stdlib.h>
using namespace std;
template <class T>
class tcontainer
{
virtual void push(const T&) = 0; //插入
virtual void pop() = 0; //删除
virtual const T& begin() = 0; //
virtual const T& end() = 0; //
virtual size_t size() = 0; //返回长度
};
template <class T>
class tvector : public tcontainer<T>
{
static const size_t _step = 100; //一次增加容量的大小
private:
size_t _size; //实际元素的个数
size_t _cap; //已分配的容量
T* buf; //首地址
public:
tvector()
{
_size = 0; //初始化容器实际大小
_cap = _step; //初始化容器容量的大小为_step
buf = 0; //首地址需要动态分配内存
re_capacity(_cap); //此时buf为空,即要设置buf初始值,配了100个元素的空间
}
~tvector()
{
//free(buf); //释放内存
delete[] buf;
buf = NULL;//防止迷途指针
}
void re_capacity(size_t s) //调整容量
{
if(!buf) //buf初始为空
{
buf = new T[s];
}
else
{
delete[] buf;
buf = new T[s];
//buf = (T*)realloc(buf,sizeof(T)*s); //在buf基础上调整容量
}
}
void push(const T& v)//入栈
{
if(_size >= _cap) //超过容量
re_capacity(_cap += _step);//依步长为step的值增加数组的空间
buf[_size++] = v;
}
void pop() //删除最后一个元素
{
if(_size)
_size--;
}
const T& begin() //返回第一个元素
{
return buf[0];
}
const T& end() //返回最后一个元素
{
if(_size)
return buf[_size-1];
else
return false;
}
size_t size() //返回容量的大小
{
return _size;
}
const T& operator[](size_t i) //取第i个元素
{//重载运算符
if(i >= 0 && i < _size)
return buf[i];
}
};
int main()
{
tvector<int> v;
cout<<"use push():"<<endl;
for(int i = 0; i < 10; ++i)
{
v.push(i);
}
for(int i = 0; i < 10; ++i)
{
cout<<v[i]<<" ";
}
cout<<endl<<"use size():"<<endl;
cout<<v.size()<<endl;
cout<<"use pop():"<<endl;
v.pop();
cout<<"pop()一次后:"<<endl;
cout<<v.size()<<endl;
for(unsigned int i = 0; i < v.size(); ++i)
{
cout<<v[i]<<" ";
}
cout<<endl;
return 0;
}
结果:
use push():
0 1 2 3 4 5 6 7 8 9
use size():
10
use pop():
pop()一次后:
9
0 1 2 3 4 5 6 7 8
Process returned 0 (0x0) execution time : 0.299 s
Press any key to continue.