栈与队列-顺序栈与链栈类模板的实现(数据结构基础 第3周)

这是用C++编写的栈的类模板的实现,包括顺序栈和链栈,并进行了简单的测试。
代码中srrStack类和lnkStack类均继承于Stack类, Stack类可以看成是栈的逻辑结构(ADT抽象数据类型,Abstract Data Type)。注意这里实现是栈与我们在STL中使用的不太一样,比如:pop(T& item)可返回其栈顶值。
源码
//Stack.h

#pragma 

template <class T>   //栈的元素类型为T
class Stack {
public:                       //栈的运算集
    void clear();               //变为空栈
    bool push(const T item);     //item入栈,成功则返回真,否则返回假
    bool pop(T& item);        //弹出栈顶内容,成功返回真,否则返回假
    bool top(T& item);        //返回栈顶内容但不弹出,成功返回真,否则返回假
    bool isEmpty();      //若栈已空返回真
};

template <class T>
class arrStack : public Stack <T> {
private:                         //栈的顺序存储
    int mSize;                //栈中最多可存放的元素个数
    int htop;              //栈顶位置,应小于mSize
    T* st;                 //存放栈元素的数组
public:
    arrStack(int size=10):mSize(size),htop(-1) {   //创建一个给定长度的顺序栈实例
        st=new T[mSize];
    }
    ~arrStack() { delete [] st; }      //析构函数
    void clear() { htop=-1; }          //清空栈内容
    bool push(const T item) {           //入栈操作的顺序实现
        if (htop == mSize-1) {            //栈已满
            T *newSt = new T[mSize*2];      
            for(int i=0; i<=htop; i++)
                newSt[i]=st[i];
            delete [] st;      //释放原栈
            st=newSt;
            mSize *= 2;
        }
        st[++htop] = item;   //新元素入栈并修改栈顶指针
        return true;
    }
    bool pop(T& item) {    //出栈的顺序实现
        if (htop==-1) {         //栈为空
            cout << "The stack is empty" << endl;
            return false;
        }
        else {
            item = st[htop--];      //返回栈顶元素并修改栈顶指针
            return true;
        }
    }
    bool top(T& item) {                   //返回栈顶内容,但不弹出
        if (htop==-1) {                     //栈空
            cout << "The stack is empty" << endl;
            return false;
        }
        else {
            item=st[htop];
            return true;
        }
    }
    bool isEmpty() {
        if (htop==-1) {
            return true;
        }
        else {
            return false;
        }
    }
};

template <class T> 
class Link
{
public:
    T data;  //用于保存结点元素的内容
    Link<T> *next;  //指向后继结点的指针
    Link(const T info, Link<T>* nextValue=NULL) {
        data=info;
        next= nextValue;
    }
    Link():next(NULL) {}
};

template <class T>
class lnkStack : public Stack <T> {   //栈的链式存储结构
private:
    Link<T>* htop;    //指向栈顶的指针
    int size;       //存放元素的个数
public:
    lnkStack():htop(NULL),size(0) {}      //构造函数
    ~lnkStack() {                      //析构函数
        clear();
    }
    void clear() {                       //清空栈的内容
        while(htop!=NULL) {
            Link<T>* tmp=htop;
            htop=htop->next;
            delete tmp;
        }
        size = 0;
    }
    bool push(const T item) {                  //入栈操作的链式实现
        Link<T>* tmp=new Link<T>(item,htop);
        htop = tmp;
        size++;
        return true;
    }
    bool pop(T& item) {          //出栈的链式实现
        Link<T>* tmp;
        if (size==0) {
            cout << "The stack is empty" << endl;
            return false;
        }
        item=htop->data;
        tmp=htop->next;
        delete htop;
        htop = tmp;
        size--;
        return true;
    }
    bool top(T& item) {               //返回栈顶内容,但不弹出
        if (size==0) {
            cout << "The stack is empty" << endl;
            return false;
        }
        item = htop->data;
        return true;
    }
    bool isEmpty() {
        if (size==0) {
            return true;
        }
        else {
            return false;
        }
    }
};

//test.cpp

#include <iostream>
#include"Stack.h"
using namespace std;

int main() {
    arrStack<int> arrs;
    lnkStack<int> lnks;
    for (int i=1; i<=10; i++){
        arrs.push(i);
        lnks.push(i);
    }
    int topelem;
    cout << "arrStack栈中元素依次为:";
    while(!arrs.isEmpty()) {
        arrs.top(topelem);           //返回栈顶内容但不弹出
        cout << topelem << ' ';
        arrs.pop(topelem);     //弹出栈顶内容且返回其值
    }
    cout << endl;
    cout << "lnkStack栈中元素依次为:";
    while(!lnks.isEmpty()) {
        lnks.top(topelem);           //返回栈顶内容但不弹出
        cout << topelem << ' ';
        lnks.pop(topelem);     //弹出栈顶内容且返回其值
    }
    cout << endl;
    return 0;
}

你可能感兴趣的:(栈与队列-顺序栈与链栈类模板的实现(数据结构基础 第3周))