//15.3.2栈模板
#ifndef STACKT_H_
#define STACKT_H_
template<class T> class stacktIter;//先声明,下面的类中要用到该模板。
template<class T> class stackt
{
enum { size = 100 };
T stack[size];
int top;
public:
stackt() : top(0)
{
stack[top] = 0;
}
void push(const T& i)
{
if ( top < size )
stack[top++] = i;
}
T pop()
{
return stack[top > 0 ? --top : top];
}
friend class stacktIter<T>;
};
template<class T> class stacktIter
{
stackt<T>& S;//在引用模板参数的地方,必须伴有该模板的参数列表
int index;//模板参数列表中的参数将会被重组,以对于每一个模板实例产生唯一的类名称
public:
stacktIter(stackt<T>& is) : S(is) , index(0) {}
T& operator++ ()
{
if ( index < S.top - 1 )
index++;
return S.stack[index];
}
T& operator++ (int)
{
int returnindex = index;
if ( index < S.top - 1 )
index++;
return S.stack[returnindex];
}
};
#endif
以上代码为栈模板的实现,下面将有个函数测试该代码
int fib(int N)
{
const sz = 100;
static F[sz];//初始化为0
F[0] = F[1] = 1;
int i;
for ( i = 0 ; i < sz ; i++ )
{
if ( F[i] == 0 )
break;
while ( i <= N )
{
F[i] = F[i-1] + F[i-2];
i++;
}
}
return F[N];
}
int _tmain(int argc, _TCHAR* argv[])
{
stackt<int> is;
for ( i = 0 ; i < 20 ; i++ )
is.push(fib(i));
stacktIter<int> it(is);
for ( j = 0 ; j < 20 ; j++ )
cout << it++ << endl;
for ( int k = 0 ; k < 20 ; k++ )
cout << is.pop() << endl;
return 0;
}