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;
}

測試結果

總結:其實我們在實際的生產環境中可能遇到的情況更加複雜,這時我們應該根據實際情況改造出適合我們的棧。

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