之前写了个链式栈,感觉还是不怎么熟悉类模板,所以再写了个顺序栈的加深下印象,内容也比之前的那个丰富多了。
测试了多个数据均没有找到错误。。(哈。。。找到错误的就顺便帮留个言告知下吧)
下面是一如既往的贴代码
类的实现:
#include<iostream>
template<class T>
class stack
{
public:
stack():top(NULL),base(NULL),usd(0),sz(0),realsize(0){}
stack(int x):base(new T[x]),top(base),sz(x),usd(0),realsize(x){}
stack(int x,T a);
stack(stack &a); //复制构造函数
void push(const T& x);
void pop();
T& get_top();
int resize(unsigned long x);
unsigned long capacity() {return realsize;}
unsigned long size() {return sz;};
unsigned long used() {return usd;}
int is_empty() {return usd==0;}
void destroy() {delete base;}
void clear() {usd=0;top=base;}
~stack() {destroy();}
stack& operator=(stack& x); //赋值操作符
private:
T *base;
T *top;
unsigned long usd; //已用大小
unsigned long sz; //可用大小
unsigned long realsize; //总大小
};
template<class T>stack<T>& stack<T>::operator=(stack<T>& x)
{
if(base!=NULL) delete base; //delete掉自己身的base再重新分配
T *p=new T[x.realsize];
sz=x.sz;
usd=x.usd;
realsize=x.realsize;
for(long i=0;i<long(usd);++i) p[i]=x.base[i];
base=p;
top=base+long(usd);
return *this;
}
template<class T>stack<T>::stack(stack<T>& a)
{
sz=a.sz;
realsize=a.realsize;
usd=a.usd;
base=new T[sz];
top=base;
for(int i=0;i<long(usd);++i) *(top++)=a.base[i];
}
template<class T>stack<T>::stack(int x,T a):base(new T[x]),top(base),sz(x),usd(0),realsize(x)
{
while(x--) push(a);
}
template<class T>int stack<T>::resize(unsigned long x)
{
if(x==sz)
return 0;
else if(x>sz)
{
if(x>realsize) //判断要分配是否比已分配的内存大
{ //小于的话就直接将可用大小设置为要分配的大小
T *p=new T[x]; //大于则重新申请内存,并将原有数据复制过去
if(!p) return -1;
sz=x;
realsize=x;
for(long i=0;i<long(usd);++i) p[i]=base[i];
delete base;
base=p;
top=base+long(usd);
}
else
sz=x;
return 0;
}
else if(x>0 && x<sz) //要分配的大小小于可用大小,进行截断
{
sz=x;
usd=x;
top=base+usd;
return 0;
}
else
throw std::runtime_error ("Size of spaces must be a positive number!");
}
template<class T>void stack<T>::push(const T& x)
{
if(usd==sz) throw std::runtime_error("Stack is full!");
*(top++)=x;
++usd;
}
template<class T>void stack<T>::pop()
{
if(!is_empty())
{
--top;
--usd;
return;
}
throw std::runtime_error ("Pop data from a empty stack!");
}
template<class T>T& stack<T>::get_top()
{
if(!is_empty())
{
return *(top-1);
}
throw std::runtime_error ("Get data from a empty stack!");
}
template<class T>std::ostream& operator<<(std::ostream& out,stack<T>& a)
{
out<<"Top element:"<<a.get_top()<<" Used:"<< a.used ()<< " Size:"<<a.size ()<<" Capacity:"<<a.capacity();
return out;
}
主函数包括测试的函数:
class test
{
public:
test():a(0){}
test(int x):a(x){}
int get(){return a;}
private:
int a;
};
std::ostream& operator<<(std::ostream& out,test& a)
{
out<<a.get();
return out;
}
int main()
{
stack<test>b(3,test(3));
stack<test>c(b); //复制构造
stack<test>a;
a=c; //赋值
a.resize (5); //重置大小
a.push (test(5));
a.push(test(7));
std::cout<<a.size()<<std::endl;
for(int i=0;i<a.size ();++i)
{
std::cout<<a<<std::endl;
a.pop();
}
a.resize(4);
std::cout<<a.size()<<std::endl;
for(int i=0;i<a.size ();++i)
{
std::cout<<a<<std::endl;
a.pop();
}
}
运行截图:
总结:
之前好像想说些什么。。。给忘了。。算了。不写了。。