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

数据结构——顺序双栈模板类实现

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

数据结构3.1.2
顺序栈中单栈和双栈(数组的两端分别为栈底)其实极为相似,道理上是一样的,实现的时候只需要多定义一套top标记和bottom标记即可,在判断栈FULL的时候,即是判断两个top是否相遇,这里我用两个元素的数组来定义两个栈顶标记,下面贴出代码(实现方式是多种多样的,如有不当,万望指正)^ _ ^
模板类代码:

#include <iostream>
#include <cassert>
using namespace std;
template<class T>
class DBstack {
public:
    DBstack(int sz = 100);                      //构造函数/每个栈的起始容量是50
    ~DBstack();                                    //析构函数
    bool Push(T & x, int d);                    //将x推入d代表的栈中,d = 0是1号栈否则为2号栈
    bool Pop(T & x, int d);                     //将d号栈顶元素弹出,其值返回在引用x当中,d = 0是1号栈否则为2号栈
    bool getTop(T & x, int d);                  //得到d号栈的栈顶元素,其值返回带x的引用当中(不弹出)
    bool isEmpty(int d)const;                   //判断d号栈是否为NULL
    bool isFull()const;                         //判断栈是否为满
    int getSize(int d)const;                    //返回d号栈当前元素的个数
    void makeEmpty(int d);                      //清空d号栈
    void output(int d)const;                    //输出d号栈的内容
private:
    T *stack;                                   //双栈数组
    int top[2];                                 //分别是两个栈的栈顶指针
    int bottom[2];                              //两个栈的栈底指针
    void overflowProcess();                     //栈的溢出处理
};
//函数定义
template<class T>
DBstack<T>::DBstack(int sz) {
    //构造函数
    stack = new T[sz];          //开辟双栈数组
    assert(stack != NULL);      //中断处理
    top[0] = bottom[0] = -1;
    top[1] = bottom[1] = sz;
}

template<class T>
DBstack<T>::~DBstack() {
    //析构函数,释放程序中的资源
    delete[] stack;
}

template<class T>
bool DBstack<T>::Push(T & x, int d) {
    //将x推入d代表的栈中,d = 0是1号栈否则为2号栈
    if (top[0] + 1 == top[1]) {                     //再插入即两个top相遇
        return false;                               //栈满,存储失败
    }
    if (0 == d) {
        //推入1号栈
        stack[++top[0]] = x;
    }
    else {
        stack[--top[1]] = x;
    }
    return true;
}

template<class T>
bool DBstack<T>::Pop(T & x, int d) {
    //将d号栈顶元素弹出,其值返回在引用x当中,d = 0是1号栈否则为2号栈
    if (isEmpty(d)) {                           //检查栈是否为NULL
        return false;                           
    }
    //执行弹出操作
    if (0 == d) {
        x = stack[top[0]--];
    }
    else {
        x = stack[top[1]++];
    }
    return true;
}

template<class T>
bool DBstack<T>::getTop(T & x, int d) {
    //得到d号栈的栈顶元素,其值返回带x的引用当中(不弹出)
    if (0 == d) {
        x = stack[top[0]];
        return true;
    }
    else {
        x = stack[top[1]];
        return true;
    }
    return false;
}

template<class T>
bool DBstack<T>::isEmpty(int d)const {
    //判断d号栈是否为NULL
    if (0 == d) {
        if (top[0] == bottom[0]) {
            return true;
        }
    }
    else {
        if (top[1] == bottom[1]) {
            return true;
        }
    }
    return false;
}

template<class T>
bool DBstack<T>::isFull()const {
    //判断栈是否为FULL
    if (top[0] == top[1]) {
        return true;
    }
    return false;
}

template<class T>
int DBstack<T>::getSize(int d) const {
    //返回d号栈当前元素的个数
    if (0 == d) {
        return top[0] + 1;
    }
    else {
        return 100 - top[1];
    }
}

template<class T>
void DBstack<T>::makeEmpty(int d) {
    //set NULL
    if (0 == d) {
        top[0] = bottom[0];
    }
    else {
        top[1] = bottom[1];
    }
}

template<class T>
void DBstack<T>::output(int d)const {
    //输出任意栈的全部元素
    if (0 == d) {
        //输出1号栈的全部元素
        for (int i = bottom[0] + 1; i <= top[0]; i ++) {
            cout << stack[i] << ' ';
        }
    }
    else {
        //输出2号栈的全部元素
        for (int j = bottom[1] - 1; j >= top[1]; j --) {
            cout << stack[j] << ' ';
        }
    }
    cout << endl;
}

main测试代码:

int main()
{
    //填充元素测试
    DBstack<int> doubl_stack;                   //创建一个双栈
    for (int i = 1; i <= 5; i ++) {             //给0号栈填充上5个值
        doubl_stack.Push(i , 0);
    }
    for (int j = 1; j <= 7; j++) {              //同上
        doubl_stack.Push(j, 1);                 //第二个参数非0即可
    }
    doubl_stack.output(0);                      //输出两个栈中的元素
    doubl_stack.output(1);

    //弹出元素测试
    int pop_1, pop_2, pop_3, pop_4;
    doubl_stack.Pop(pop_1, 0);
    doubl_stack.Pop(pop_2, 1);
    doubl_stack.Pop(pop_3, 1);
    doubl_stack.Pop(pop_4, 1);
    doubl_stack.output(0);                      //输出两个栈中的元素
    doubl_stack.output(1);

    //得到元素个数测试
    int add_1 = 100;
    doubl_stack.Push(add_1, 0);
    cout << doubl_stack.getSize(0) << endl;
    cout << doubl_stack.getSize(1) << endl;

    //set Empty测试
    int pop_5;
    doubl_stack.makeEmpty(0);
    doubl_stack.output(0);
    doubl_stack.output(1);
    doubl_stack.Pop(pop_5 ,0);                  //检测pop函数对Empty的处理是否正常

    system("pause");
    return 0;
}

运行效果:
数据结构——顺序双栈模板类实现