兩棧共享空間,顧名思義,就是申請兩個棧,佔用同一個數組(從數組的兩端作爲兩個棧的初始棧頂)
應用場景:在一個程序中同時使用具有相同數據類型的兩個棧,兩個棧的長短可能不一(出現一個很長,一個很短)
實現:基於順序棧的基礎
類模板:
#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;
}
總結:其實我們在實際的生產環境中可能遇到的情況更加複雜,這時我們應該根據實際情況改造出適合我們的棧。