用C++实现栈的建立,进栈,出栈,写简单点,要有注释,谢谢各位了
2个回答
展开全部
#ifndef SQSTACKMANAGER_H
#define SQSTACKMANAGER_H
#include<malloc.h>
typedef unsigned int DWORD;
template<class ElemType,DWORD Init_Size>//1,指定栈中元素类型,2,栈中元素容量
class SqStackManager
{
public:
enum
{
STACK_INIT_SIZE=Init_Size, //初始化栈的容量
STACK_INCREMENT_SIZE=Init_Size //栈容量不够时,增长的数值
};
typedef struct //内部栈结构
{
ElemType* base;
ElemType* top;
int stacksize;
}SqStack;
SqStackManager() //无参构造函数
{
InitStack();
}
virtual~SqStackManager() //虚析构函数
{
DestroyStack();
}
void ClearStack() //清空栈把所有元素初始化为原始状态
{
DestroyStack();
InitStack();
}
bool PushStack(ElemType e) //元素入栈操作
{
if(S.top-S.base>=S.stacksize) //栈容量不够时
{
ElemType* newbase=(ElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT_SIZE)*sizeof(ElemType));
if(!newbase)
return false;
S.base=newbase;
S.stacksize+=STACK_INCREMENT_SIZE;
}
*S.top=e; //栈容量足够时
S.top++;
return true;
}
bool PopStack(ElemType& e) //出栈操作
{
if(S.top==S.base) //空栈,出栈返回false
{
e=0;
return false;
}
S.top--;
e=*S.top;
return true;
}
bool StackEmpty() //栈空判断,是true,否false
{
return (S.top==S.base);
}
int GetStackLength() //当前栈中元素个数
{
return (S.top-S.base);
}
bool GetStackTop(ElemType& e,bool rflag=false) //获得栈顶元素,rflag=true时移除栈顶,否则不移除
{
if(StackEmpty())
{
e=0;
return false;
}
if(!rflag)
{
e=*(S.top-1);
}
else
{
Pop(e);
}
return true;
}
void TraverseStack(void(*Visit)(ElemType&))//遍历栈中元素,可以使用visit函数操作。
{
int len=GetStackLength();
for(int i=0;i<len;i++)
Visit(S.base[i]);
}
#ifdef DEBUG_CLASS //用于调试工作的宏
void PrintStack()
{
int i=0;
while(i<S.top-S.base)
{
cout<<S.base[i++]<<endl;
}
}
#endif
private:
void InitStack() //辅助构造函数,初始化栈
{
S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
void DestroyStack() //辅助析构函数,销毁栈
{
if(S.base)
free(S.base);
S.top=S.base=NULL;
S.stacksize=0;
}
private:
SqStack S; //管理的栈对象
};
#endif
#define SQSTACKMANAGER_H
#include<malloc.h>
typedef unsigned int DWORD;
template<class ElemType,DWORD Init_Size>//1,指定栈中元素类型,2,栈中元素容量
class SqStackManager
{
public:
enum
{
STACK_INIT_SIZE=Init_Size, //初始化栈的容量
STACK_INCREMENT_SIZE=Init_Size //栈容量不够时,增长的数值
};
typedef struct //内部栈结构
{
ElemType* base;
ElemType* top;
int stacksize;
}SqStack;
SqStackManager() //无参构造函数
{
InitStack();
}
virtual~SqStackManager() //虚析构函数
{
DestroyStack();
}
void ClearStack() //清空栈把所有元素初始化为原始状态
{
DestroyStack();
InitStack();
}
bool PushStack(ElemType e) //元素入栈操作
{
if(S.top-S.base>=S.stacksize) //栈容量不够时
{
ElemType* newbase=(ElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT_SIZE)*sizeof(ElemType));
if(!newbase)
return false;
S.base=newbase;
S.stacksize+=STACK_INCREMENT_SIZE;
}
*S.top=e; //栈容量足够时
S.top++;
return true;
}
bool PopStack(ElemType& e) //出栈操作
{
if(S.top==S.base) //空栈,出栈返回false
{
e=0;
return false;
}
S.top--;
e=*S.top;
return true;
}
bool StackEmpty() //栈空判断,是true,否false
{
return (S.top==S.base);
}
int GetStackLength() //当前栈中元素个数
{
return (S.top-S.base);
}
bool GetStackTop(ElemType& e,bool rflag=false) //获得栈顶元素,rflag=true时移除栈顶,否则不移除
{
if(StackEmpty())
{
e=0;
return false;
}
if(!rflag)
{
e=*(S.top-1);
}
else
{
Pop(e);
}
return true;
}
void TraverseStack(void(*Visit)(ElemType&))//遍历栈中元素,可以使用visit函数操作。
{
int len=GetStackLength();
for(int i=0;i<len;i++)
Visit(S.base[i]);
}
#ifdef DEBUG_CLASS //用于调试工作的宏
void PrintStack()
{
int i=0;
while(i<S.top-S.base)
{
cout<<S.base[i++]<<endl;
}
}
#endif
private:
void InitStack() //辅助构造函数,初始化栈
{
S.base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
void DestroyStack() //辅助析构函数,销毁栈
{
if(S.base)
free(S.base);
S.top=S.base=NULL;
S.stacksize=0;
}
private:
SqStack S; //管理的栈对象
};
#endif
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询