スタックのC++テンプレート実装により、異なるタイプの要素をサポート

1859 ワード

#pragma once
#include 
using namespace std;

class underflow : public exception
{
	const char * what() const
	{
		return "   ";
	}
};
class overflow : public exception
{
	const char * what() const
	{
		return "   ";
	}
};

template  class mystack {
public:
	mystack(int s) :size(s) { top = new T*[size]; base = top; };//     s  
	mystack() :size(12) { top = new T*[size]; base = top; };//  ,      12
	~mystack();
	int push(T&);//       
	T pop();//       ,       
	int getsize() { return size; };
	bool isfull() { return (top == &base[size - 1]); }
	bool isempty() { return empty; }
private:
	const int size;
	T**top;
	T**base;
	bool empty=1;
protected:
	T popr() ;//   pop  ,        ,              
};

template  mystack::~mystack()
{
	while (!empty)popr();
	delete[]base;
}


template  int mystack::push(T& e)
{
	if (empty == 1) empty = 0;
	if (top >&base[size - 1])
	{
		throw overflow();
		return 0;//  ,    ,    
	}
	*top = new T(e); 
	top++;
	if (top <= &base[size - 1]) 
		return 1;//       
	else
		return -1;//    
}
template  T mystack::pop()
{
	if (empty)
	{
		throw underflow();//  ,    ,    
		return **top;
	}
	return popr();
}
template  T mystack::popr()
{
	top--;
	if (top == base) empty = 1;
	T e(**top);//               ,        
	delete *top;
	return e;
}

スタック内の要素は動的にメモリ*を割り当て、sizeサイズのポインタ配列で保存されます.(スタック内の要素は不連続ですが、ポインタは連続しています)
冒頭の2つのexceptionは異常を投げ出すタイプで、それぞれスタックのオーバーフローとオーバーフローを表す.対外的なインタフェースはpush,pop,getsize,isfull,isemptyである.
popがそうであるのは,真のスタック動作と放出異常を分離するためであり,構造関数において異常を放出する可能性を回避するためである.構造関数から異常を投げ出すと、非常に不快な結果を引き起こす可能性があります(または、構造関数でcatchで異常を取り除き、何もしないこともできます).
 
*複製コンストラクタは実装されていません.