之前寫了個鏈式棧,感覺還是不怎麼熟悉類模板,所以再寫了個順序棧的加深下印象,內容也比之前的那個豐富多了。
測試了多個數據均沒有找到錯誤。。(哈。。。找到錯誤的就順便幫留個言告知下吧)
下面是一如既往的貼代碼
類的實現:
#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();
}
}
運行截圖:
總結:
之前好像想說些什麼。。。給忘了。。算了。不寫了。。