模板类的练习——栈

类别:编程语言 点击:0 评论:0 推荐:

学C++ 的时候写的模板类以作为对C++的练习,
#include <stdlib.h>
#include <malloc.h>
#define stack_init_size 100

template<class T>
class CStack
{
public:
 CStack(void);
 ~CStack(void);
public:
 // ------------栈的顺序存储表示--------------
 static struct _tagStack
 {
  T* base; //在栈构造之前和销毁之后,base 的值为null;
  T* top; //栈顶指针
  int stacksize;
 };
private:
 typedef _tagStack SqStack;

public:
 int Push(SqStack& S, T e);

 int InitStack(SqStack& s);

 int Pop(SqStack& s, T& e);

 int StackEmpty(SqStack s);

 int StackLength(SqStack s);

 void GetTop(SqStack s,T& e);

 void ClearStack(SqStack& s);
 
 void DestroyStack(SqStack& s);

 void StackTraverse(SqStack& s);
 //迷宫求解 经典算法
// int MazePath(MazeType maze,PostType start,PostType end);
};
template<class T>
CStack<T>::CStack(void)
{
}
template<class T>
CStack<T>::~CStack(void)
{
}
//入栈
template<class T>
int CStack<T>::Push(SqStack& S, T e)
{
 if(S.top - S.base >= S.stacksize) //栈满,追加存储
 {
  S.base = (T*) realloc(S.base,
   (S.stacksize + stack_init_size) * sizeof(T));
  if(S.base == NULL) return -1;
  S.top = S.base + S.stacksize;
  S.stacksize += stack_init_size;  
 }
 *S.top++ = e;
 return 0;
}
//初始化栈
template<class T>
int CStack<T>::InitStack(SqStack& s)
{
 s.base = new T[stack_init_size];
 if(s.base == NULL) return -1;
 s.top = s.base;
 s.stacksize = stack_init_size;
 return 0;
}
//弹出栈顶
template<class T>
int CStack<T>::Pop(SqStack& s, T& e)
{
 if(s.top == s.base) //栈已空
 {
  
  return -1;
 }
 e = *--s.top;
 return 0;
}
//判断栈是否为空
template<class T>
int CStack<T>::StackEmpty(SqStack s)
{
 if(s.base == s.top) return 1;
 return 0;
}

//清空栈
template<class T>
void CStack<T>::ClearStack(SqStack& s)
{
 T* tmp = s.base;
 while(tmp!= s.top)
  *tmp =NULL;

}

//返回栈顶数据
template<class T>
void CStack<T>::GetTop(SqStack s,T& e)
{
 if(s.top == s.base ) //栈为空
  return;
 e = *(s.top-1);
}

//取得栈的长度
template<class T>
int CStack<T>::StackLength(SqStack s)
{
 return (s.top-s.base);
}

//销毁栈
template<class T>
void CStack<T>::DestroyStack(SqStack& s)
{
 s.top = s.base;  
}
template<class T>
void CStack<T>::StackTraverse(SqStack& s)
{
 int i=0;
 T tmp;
 int len=StackLength(s);
 for(;i<len/2;i++)
 {
  tmp = *(s.base + i);
  *(s.base + i) = *(s.base + len - i - 1);
  *(s.base + (s.top - s.base) - i - 1) = tmp;
 }
}

本文地址:http://com.8s8s.com/it/it25280.htm