C++数据结构:栈——顺序栈实现的之二:两栈共享空间

两栈共享空间,顾名思义,就是申请两个栈,占用同一个数组(从数组的两端作为两个栈的初始栈顶)
应用场景:在一个程序中同时使用具有相同数据类型的两个栈,两个栈的长短可能不一(出现一个很长,一个很短)
实现:基于顺序栈的基础
类模板:


#pragma once
#include<iostream>
using namespace std;

const int MaxSize = 10;

template<typename T>
class Stack {
public:
    Stack();
    ~Stack();
    bool Empty(int i);    //判空
    bool Full();    //判满
    bool EnStack(int i,T x);    //入栈
    bool pop(int i);     //出栈。
    bool GetTop(int i,T &element);    //获取栈顶元素
private:
    T data[MaxSize];
    int top1;
    int top2;
};

template<typename T>
Stack<T>::Stack() {
    top1 = -1;
    top2 = MaxSize;
}
template<typename T>
Stack<T>::~Stack() {

}
template<typename T>
bool Stack<T>::Empty(int i) {
    if (i == 1) {
        return top1 == -1 ? true : false;
    }
    else if (i == 2) {
        return top2 == MaxSize ? true : false;
    }
}
template<typename T>
bool Stack<T>::Full() {

    return top1 == top2-1 ? true : false;
}
template<typename T>
bool Stack<T>::EnStack(int i,T x) {
    if (Full()) {
        return false;
    }
    if (i == 1) {
        top1++;
        data[top1] = x;
    }
    else if (i==2) {
        top2--;
        data[top2] = x;
    }
    return true;
}
template<typename T>
bool Stack<T>::pop(int i) {
    if (Empty(i)) {
        return false;
    }
    if (i == 1) {
        top1--;
    }
    else if (i==2) {
        top2++;
    }
    return true;
}
template<typename T>
bool Stack<T>::GetTop(int i,T &element) {
    if (!Empty(i)) {
        if (i==1) {
            element = data[top1];
        }
        else if (i == 2) {
            element = data[top2];
        }
        return true;
    }
    return false;
}

验证:

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


int main() {
    Stack<int>  *p = new Stack<int>;
    cout<<p->Empty(1)<<endl;
    cout << p->Empty(2) << endl;
    p->EnStack(1,1);
    int element;
    if (p->GetTop(1,element)) {
        cout << element << endl;
    }
    p->EnStack(1,2);
    if (p->GetTop(1,element)) {
        cout << element << endl;
    }
    p->EnStack(1, 3);
    if (p->GetTop(1,element)) {
        cout << element << endl;
    }
    p->EnStack(1, 4);
    if (p->GetTop(1, element)) {
        cout << element << endl;
    }
    p->EnStack(1, 5);
    if (p->GetTop(1, element)) {
        cout << element << endl;
    }
    cout << p->Full() << endl;
    cout << p->Empty(1)<<endl;
    p->EnStack(2, 6);
    if (p->GetTop(2, element)) {
        cout << element << endl;
    }
    p->EnStack(2, 7);
    if (p->GetTop(2, element)) {
        cout << element << endl;
    }
    p->EnStack(2, 8);
    if (p->GetTop(2, element)) {
        cout << element << endl;
    }
    p->EnStack(2, 9);
    if (p->GetTop(2, element)) {
        cout << element << endl;
    }
    p->EnStack(2, 10);
    if (p->GetTop(2, element)) {
        cout << element << endl;
    }
    cout<<p->Full()<<endl;
    return 0;
}

测试结果

总结:其实我们在实际的生产环境中可能遇到的情况更加复杂,这时我们应该根据实际情况改造出适合我们的栈。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章