順序棧類模板

之前寫了個鏈式棧,感覺還是不怎麼熟悉類模板,所以再寫了個順序棧的加深下印象,內容也比之前的那個豐富多了。大笑大笑大笑

測試了多個數據均沒有找到錯誤。。(哈。。。找到錯誤的就順便幫留個言告知下吧吐舌頭)



下面是一如既往的貼代碼

類的實現:

#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();
	}
}

運行截圖:



總結:

之前好像想說些什麼。。。給忘了。。算了。不寫了。。大笑

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章