欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构——基本栈的模板类

程序员文章站 2022-06-01 11:29:06
...

数据结构笔记
这篇文章主要是给出栈的基本操作的代码(如: POP、PUSH等),是一个最基本的栈的模板类。

#include <iostream>
#include <cassert>
#include "stack.h"
using namespace std;
const int stackIncreament = 20;                             //栈溢出时扩展空间的增量

template<class T>
class SeqStack :public Stack<T> {
public:
    SeqStack(int sz = 50);                                  //建立一个空栈
    ~SeqStack();                                           //析构函数
    void Push(const T & x);                                 //如果IsFull则溢出处理,否则把x推入栈顶
    bool Pop(T & x);                                        //如果IsEmpty则不执行,返回false,否则推掉栈顶元素并返回true
    //推出元素值通过引用参数x返回
    bool getTop(T & x)const;                                //如果栈为NULL则返回false,否则返回true,栈顶元素的值通过x传回
    bool IsEmpty()const;                                    //如果栈中元素等于0个返回true,否则返回false
    bool IsFull()const;                                     //如果栈中元素等于maxSize,返回true,否则返回false
    int getSize()const;                                     //返回栈中元素的个数
    void makeEmpty();                                       //清空栈的内容
    void output(ostream & os);
private:
    T *elements;                                            //存放栈中元素的栈数组
    int top;                                                //标记栈的top
    int maxSize;                                            //栈的最大能容元素的个数
    void overflowProcess();                                 //栈的溢出处理
};

template<class T>
void SeqStack<T>::output(ostream & os) {
    os << "top = " << top << endl;
    for (int i = 0; i <= top; i++) {
        os << i << ":" << elements[i] << endl;
    }
}

template<class T>
ostream & operator << (ostream & os, SeqStack<T> & s) {
    s.output(os);
    return os;
}

template<class T>
SeqStack<T>::~SeqStack() {
    delete[] elements;
}

template<class T>
bool SeqStack<T>::IsEmpty() const {
    //判断是否为NULL
    if (-1 == top) {
        return true;
    }
    else {
        return false;
    }
}

template<class T>
bool SeqStack<T>::IsFull() const {
    //判断栈是否FULL
    if (maxSize - 1 == top) {
        return true;
    }
    else {
        return false;
    }
}

template<class T>
void SeqStack<T>::makeEmpty() {
    //清空栈
    top = -1;
}

template<class T>
int SeqStack<T>::getSize()const {
    return top + 1;
}

template<class T>
SeqStack<T>::SeqStack(int sz) {
    top = -1;
    maxSize = sz;
    //建立一个最大尺寸为sz的空栈,若分配不成功则错误处理
    elements = new T[maxSize];                              //创建栈的数组空间  
    assert(elements != NULL);                               //断言:动态存储分配是否成功
}

template<class T>
void SeqStack<T>::overflowProcess() {
    //私有函数:扩充栈的存储空间
    T * newArray = new T[maxSize + stackIncreament];
    if (NULL == newArray) {
        cerr << "内存分配错误" << endl;
        exit(1);
    }
    for (int i = 0; i <= top; i++) {
        newArray[i] = elements[i];                          //将原来栈中的数据逐一copy
    }
    maxSize += stackIncreament;                             //更新栈的最大容量
    delete[] elements;                                      //释放原来的指针
    elements = newArray;                                    //更新原来的指针
}

template<class T>
void SeqStack<T>::Push(const T& x) {
    //若栈不满,则将元素x推入栈顶位置,否则溢出处理
    if (IsFull()) {
        overflowProcess();                                  //检测到栈满,扩充栈的容量
    }
    elements[++top] = x;                                    //先执行top+1,后元素进栈
}

template<class T>
bool SeqStack<T>::Pop(T & x) {
    //若栈不空则函数返回栈顶的值,并将栈顶元素弹出
    if (IsEmpty()) {
        return false;
    }
    x = elements[top--];                                    //top-1实现pop栈顶元素
    return true;
}

template<class T>
bool SeqStack<T>::getTop(T &x)const {
    //若栈不空,则函数返回栈顶元素
    if (IsEmpty()) {
        return false;
    }
    x = elements[top];
    return true;
}
int main()
{
    int pop1, pop2;
    SeqStack<int> stackTest;
    stackTest.Push(1);
    stackTest.Push(2);
    stackTest.Push(2);
    stackTest.Push(2);
    stackTest.Push(5);
    cout << stackTest;
    stackTest.Pop(pop1);
    stackTest.Pop(pop2);
    cout << stackTest;
    cout << stackTest.getSize() << endl;
    int top;
    stackTest.getTop(top);
    cout << top << endl;

    system("pause");
    return 0;
}

运行测试:数据结构——基本栈的模板类
在写这部分程序中,应该注意的是对输出操作符的重载,在涉及友元函数及其它方式时应该注意的问题,之后会有相应的总结。