//使用纯虚类实现接口
//使用两种不同底层的数据结构来实现栈的操作
//并测试其数据运行速度。
#include <iostream>
#include <vector>
#include <list>
#include <stdlib.h>
#include <ctime>
using namespace std;
//声明一个纯虚类实现接口 规范了实现类的方法
template <typename T>
class MyStack
{
public:
virtual T top()=0;
virtual int size()=0;
virtual void push(T e)=0;
virtual T pop()=0;
virtual bool empty()=0;
};
//通过类的继承来实现父类的方法
template <typename T>
class VectorStack:public MyStack<T>
{
public:
T top() override
{
return vec.back();
}
int size() override
{
return vec.size();
}
void push(T e) override
{
vec.push_back(e);
}
T pop() override
{
T ret = vec.back();
vec.pop_back();
return ret;
}
bool empty() override
{
return vec.empty();
}
private:
vector<T> vec;
};
template <typename T>
class ListStack:public MyStack<T>
{
public:
T top() override
{
return li.back();
}
int size() override
{
return li.size();
}
void push(T e) override
{
li.push_back(e);
}
T pop() override
{
T ret = li.back();
li.pop_back();
return ret;
}
bool empty() override
{
return li.empty();
}
private:
list<T> li;
};
template <typename T>
double Test_Stack(MyStack<T> &stack,int iCount)
{
clock_t startTime,endTime;
srand(time(NULL));
startTime = clock();
for(int i=0;i<iCount;i++)
{
stack.push(rand()%iCount);
}
for(int i=0;i<iCount;i++)
{
stack.pop();
}
endTime = clock();
return (endTime - startTime)/1000.0;
}
int main(int argc, char *argv[])
{
VectorStack<int> s1;
cout<<"vectorStack using time: "<<Test_Stack(s1,1000000)<<" s"<<endl;
ListStack<int> s2;
cout<<"listStack using time: "<<Test_Stack(s2,1000000)<<" s"<<endl;
return 0;
}