C++顺序栈的模板类实现

#include <iostream>
#include <assert.h>
#define stackIncreament 20

template <class T>
class SeqStack{                      //顺序栈类定义
private:
    T* elements;			                            //栈元素存放数组
    int top;				                            //栈顶指针
    int maxSize;               		                    //栈最大容量
    void overflowProcess();	                            //栈的溢出处理
public:
    SeqStack(int sz = 50);		                        //构造函数
    SeqStack(const SeqStack<T>& a);                     //复制构造函数
    ~SeqStack() { delete[] elements; }                 //析构函数
    void Push(const T& x);	                            //进栈
    bool Pop(T& x);		                                //出栈
    bool getTop(T& x);		                            //取栈顶内容
    bool IsEmpty() const { return top == -1; }          //栈空
    bool IsFull() const { return top == maxSize - 1; }  //栈满
    int getSize() const { return top + 1; }             //栈中元素个数
    void MakeEmpty() { top = -1; }                      //清空栈
    //重载=操作符
    SeqStack& operator = (const SeqStack<T>& a) {
        if (this != &a) {
            delete[] elements;
            top = a.top;
            maxSize = a.maxSize;
            elements = new T[maxSize];
            assert(elements);
            for (int i = 0; i <= top; i++) {
                elements[i] = a.elements[i];
            }
        }
        return *this;
    }
};

//构造函数
template <class T>
SeqStack<T>::SeqStack(int sz)
{
    top = -1;
    maxSize = sz;
    elements = new T[maxSize];
    assert(elements);
}


//复制构造函数
template <class T>
SeqStack<T>::SeqStack(const SeqStack<T>& a)
{
    top = a.top;
    maxSize = a.maxSize;
    elements = new T[maxSize];
    assert(elements);    
    for (int i = 0; i <= top; i++) {
        elements[i] = a.elements[i];
    }
}

//溢出处理函数
template <class T>
void SeqStack<T>::overflowProcess() {
    //私有函数:当栈满则执行扩充栈存储空间处理
    T* newArray = new T[maxSize + stackIncreament];
    assert(newArray);                    //创建更大的存储数组
    for (int i = 0; i <= top; i++)
        newArray[i] = elements[i];
    maxSize += stackIncreament;
    delete[] elements;
    elements = newArray;  	//改变elements指针
}

//入栈
template <class T>
void SeqStack<T>::Push(const T& x) {
    //若栈不满, 则将元素x插入该栈栈顶, 否则溢出处理
    if (IsFull()) overflowProcess();      //栈满
    elements[++top] = x;	     //栈顶指针先加1, 再进栈
}

//出栈
template <class T>
bool SeqStack<T>::Pop(T& x) {
    //函数退出栈顶元素并返回栈顶元素的值
    if (IsEmpty()) return false;
    x = elements[top--];	     //栈顶指针退1
    return true;		     //退栈成功
}

//取栈顶
template <class T>
bool SeqStack<T>::getTop(T& x) {
    //若栈不空则函数返回该栈栈顶元素的地址
    if (IsEmpty()) return false;
    x = elements[top];
    return true;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值