スタックの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で異常を取り除き、何もしないこともできます).
*複製コンストラクタは実装されていません.