求个C++程序代码~设计堆栈类模板

2025-05-13 14:22:47
推荐回答(2个)
回答1:

#ifndef __SQ_STACK_H__
#define __SQ_STACK_H__

#include "utility.h" // 实用程序软件包

// 顺序栈类模板
template
class SqStack
{
protected:
// 顺序栈的数据成员:
int count; // 元素个数
int maxSize; // 栈最大元素个数
ElemType *elems; // 元素存储空间

// 辅助函数模板:
bool Full() const; // 判断栈是否已满
void Init(int size); // 初始化栈

public:
// 抽象数据类型方法声明及重载编译系统默认方法声明:
SqStack(int size = DEFAULT_SIZE); // 构造函数模板
virtual ~SqStack(); // 析构函数模板
int Length() const; // 求栈长度
bool Empty() const; // 判断栈是否为空
void Clear(); // 将栈清空
void Traverse(void (*visit)(const ElemType &)) const; // 遍历栈
StatusCode Push(const ElemType &e); // 入栈
StatusCode Top(ElemType &e) const; // 返回栈顶元素
StatusCode Pop(ElemType &e); // 出栈
SqStack(const SqStack ©); // 复制构造函数模板
SqStack &operator =(const SqStack ©); // 重载赋值运算符
};

// 顺序栈类模板的实现部分

template
bool SqStack::Full() const
// 操作结果:如栈已满,则返回true,否则返回false
{
return count == maxSize;
}

template
void SqStack::Init(int size)
// 操作结果:初始化栈为最大元素个数为size的空栈
{
maxSize = size; // 最大元素个数
if (elems != NULL) delete []elems; // 释放存储空间
elems = new ElemType[maxSize]; // 分配存储空间
count = 0; // 空栈元素个数为0
}

template
SqStack::SqStack(int size)
// 操作结果:构造一个最大元素个数为size的空栈
{
elems = NULL; // 未分配存储空间前,elems为空
Init(size); // 初始化栈
}

template
SqStack::~SqStack()
// 操作结果:销毁栈
{
delete []elems; // 释放存储空间
}

template
int SqStack::Length() const
// 操作结果:返回栈元素个数
{
return count;
}

template
bool SqStack::Empty() const
// 操作结果:如栈为空,则返回true,否则返回false
{
return count == 0;
}

template
void SqStack::Clear()
// 操作结果:清空栈
{
count = 0;
}

template
void SqStack::Traverse(void (*visit)(const ElemType &)) const
// 操作结果:从栈底到栈顶依次对栈的每个元素调用函数(*visit)
{
for (int curPosition = 1; curPosition <= Length(); curPosition++)
{ // 从栈底到栈顶对栈的每个元素调用函数(*visit)
(*visit)(elems[curPosition - 1]);
}
}

template
StatusCode SqStack::Push(const ElemType &e)
// 操作结果:将元素e追加到栈顶,如成功则返加SUCCESS,如栈已满将返回OVER_FLOW
{
if (Full())
{ // 栈已满
return OVER_FLOW;
}
else
{ // 操作成功
elems[count++] = e; // 将元素e追加到栈顶
return SUCCESS;
}
}

template
StatusCode SqStack::Top(ElemType &e) const
// 操作结果:如栈非空,用e返回栈顶元素,返回SUCCESS,否则返回UNDER_FLOW
{
if(Empty())
{ // 栈空
return UNDER_FLOW;
}
else
{ // 栈非空,操作成功
e = elems[count - 1]; // 用e返回栈顶元素
return SUCCESS;
}
}

template
StatusCode SqStack::Pop(ElemType &e)
// 操作结果:如栈非空,删除栈顶元素,并用e返回栈顶元素,返回SUCCESS,否则
// 返回UNDER_FLOW
{
if (Empty())
{ // 栈空
return UNDER_FLOW;
}
else
{ // 操作成功
e = elems[count - 1]; // 用e返回栈顶元素
count--;
return SUCCESS;
}
}

template
SqStack::SqStack(const SqStack ©)
// 操作结果:由栈copy构造新栈——复制构造函数模板
{
elems = NULL; // 未分配存储空间前,elems为空
Init(copy.maxSize); // 初始化新栈
count = copy.count; // 栈元素个数
for (int curPosition = 1; curPosition <= Length(); curPosition++)
{ // 从栈底到栈顶对栈copy的每个元素进行复制
elems[curPosition - 1] = copy.elems[curPosition - 1];
}
}

template
SqStack &SqStack::operator = (const SqStack ©)
// 操作结果:将栈copy赋值给当前栈——重载赋值运算符
{
if (© != this)
{
Init(copy.maxSize); // 初始化当前栈
count = copy.count; // 复制栈元素个数
for (int curPosition = 1; curPosition <= Length(); curPosition++)
{ // 从栈底到栈顶对栈copy的每个元素进行复制
elems[curPosition - 1] = copy.elems[curPosition - 1];
}
}
return *this;
}

#endif

回答2:

STL中有吧...