双栈共享一个栈空间
为什么要使用共享栈:可能某一个栈空间不够用,总是需要扩容,而另一个栈总是有空间闲置,将两个栈的空间共享。
解决方式:将编号为 0 和 1 的两个栈存放于一个数组空间 V [m]中,栈底分别处于数组的两端。当第 0 号栈的栈顶指针 top [0] 等于-1 时该栈为空,当第 1 号栈的栈顶指针 top [1] 等于 m 时该栈为空。两个栈均从两端向中间增长。
代码如下:
#include<iostream>
#include<stack>
using namespace std;
#define maxSize 2
typedef struct{
int top[2]; //栈顶指针
int bot[2]; //栈底指针
int elem[maxSize];
}DblStack; //共享栈
//初始化
bool initStack(DblStack& s){
s.bot[0] = s.top[0] = -1;
s.bot[1] = s.top[1] = maxSize;
return true;
}
//判空
bool isEmpty(DblStack& s,int i){
return s.top[i] == s.bot[i];
}
//判满
bool isFull(DblStack& s){
return s.top[0] + 1 == s.top[1];
}
//入栈
bool push(DblStack& s,int x,int i){
if(isFull(s)) return false;
if(i == 0) s.elem[++ s.top[0]] = x;
else s.elem[-- s.top[1]]= x;
return true;
}
//出栈
bool pop(DblStack &s,int& x,int i){
if(isEmpty(s,i)) return false;
if(i == 0) x=s.elem[s.top[0] --];
else x=s.elem[s.top[1] ++];
return true;
}
int main(){
DblStack s;
initStack(s);
cout<<"左栈压入1"<<endl;
push(s, 1, 0);
cout<<"左栈是否为空?"<<isEmpty(s, 0)<<endl;
push(s, 2, 1);
cout<<"右栈压入2"<<endl;
cout<<"右栈是否为空?"<<isEmpty(s, 0)<<endl;
cout<<"共享栈是否为满?"<<isFull(s)<<endl;
int x;
cout<<"左栈弹栈"<<endl;
pop(s, x, 0);
cout<<"左是否为空?"<<isEmpty(s, 0)<<endl;
cout<<"共享栈是否为满?"<<isFull(s)<<endl;
}
执行结果: