试用多态实现线性表(队列,串,堆栈),要求具备线性表的基本操作:插入,删除,测长等。(参考程序员面试宝典 第二版P105)
#include <iostream>
#include <vector>
using namespace std;
template<class T>
class tcontainer
{
public:
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>
{
public:
static const size_t step;
tvector()
{
m_size = 0;
m_cap = 0;
m_pbuf =0;
re_capacity(m_cap);
}
~tvector()
{
free(m_pbuf);
m_pbuf = NULL;
}
virtual void re_capacity(size_t s);
virtual void push(const T&);
virtual void pop();
virtual const T &begin();
virtual const T &end();
virtual size_t size();
const T& operator[](size_t i);
private:
size_t m_size; //实际元素的个数
size_t m_cap; //已经分配的容量
T *m_pbuf; //首地址
};
template <class T>
const size_t tvector<T>::step = 100; //数组增长的步上
template <class T>
void tvector<T>::re_capacity(size_t s)
{
if (!m_pbuf)
{
m_pbuf = new T[s];
}
else
{
delete[] m_pbuf;
m_pbuf = new T[s];
}
}
template <class T>
void tvector<T>::push(const T& s) //入栈
{
if (m_size>=m_cap) //m_size指向出栈的位置
{
re_capacity(m_cap += step); //依步长为step的值增加数组的空间
}
m_pbuf[m_size++] = s;
}
template <class T>
void tvector<T>::pop() //出栈
{
if (m_size)
{
m_size--;
}
}
template <class T>
const T& tvector<T>::begin() //栈头的值
{
return m_pbuf[0];
}
template <class T>
const T& tvector<T>::end()
{
if (m_size)
{
return m_pbuf[m_size - 1];
}
else
{
return false;
}
}
template <class T>
size_t tvector<T>::size()
{
return m_size;
}
template <class T>
const T& tvector<T>::operator[](size_t i) //重载运算符
{
if (i>=0 && i<m_size)
{
return m_pbuf[i];
}
}
void main()
{
int m = 100;
tvector<int> data;
for (int i=0;i<m;i++)
{
data.push(i);
}
data.pop();
int length = data.size();
for (i=0;i<length;i++)
{
printf(" %3d",data[i]);
if (i%7 == 0)
{
cout<<endl;
}
}
system("pause");
}
运行结构: