参考《大话数据结构》P95~96——两栈共享存储空间。
当两个栈的需求空间有相反关系时,也就是一个栈增长时,另一个栈在缩短,可以采用两栈共享空间结构。这是针对两个具有相同数据类型的栈的一个设计技巧。
举个简单的例子:
代码和解释如下(VS2012测试通过):
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 #define MAXSIZE 6 //本例中栈满共6个元素 6 typedef string status;//本例尝试用书上推荐的status返回是否成功,C++中的模板类string比字符数组char[]更方便 7 8 //两栈共享空间的存储结构 9 typedef struct 10 { 11 char data[MAXSIZE]; 12 int top1;//栈1的栈顶所在元素的数组下标 13 int top2;//栈2的栈顶所在元素的数组下标 14 }SqDoubleStack; 15 16 //两栈共享空间的初始化,申请内存,把栈初始化为空栈 17 //返回指向SqDoubleStack结构的地址 18 SqDoubleStack *InitSqDoubleStack(SqDoubleStack *s) 19 { 20 s=new SqDoubleStack; 21 s->top1=-1; 22 s->top2=MAXSIZE; 23 return s; 24 } 25 26 //入栈 27 //插入元素e为新的栈顶元素,stacknumber是栈号参数 28 //因为在开始判断了是否栈满,后面的top1+1和top2-1是不担心溢出问题的 29 status Push(SqDoubleStack *s,char e,int stacknumber) 30 { 31 if(s->top1+1==s->top2)//若栈已满,不能插入新的元素 32 return "error"; 33 if(stacknumber==1)//栈1有元素进栈 34 s->data[++s->top1]=e;//先top1加1,再给数组元素赋值 35 else if(stacknumber==2)//栈2有元素进栈 36 s->data[--s->top2]=e;//先top2减1,再给数组元素赋值 37 return "push ok";//元素入栈成功 38 } 39 40 //出栈 41 status Pop(SqDoubleStack *s,char *e,int stacknumber) 42 { 43 if(stacknumber==1) 44 { 45 if(s->top1==-1)//若栈1已空,没有元素出栈 46 return "error"; 47 *e=s->data[s->top1--];//将栈1的栈顶元素先出栈,再top1减1 48 } 49 else if(stacknumber==2) 50 { 51 if(s->top2==MAXSIZE)//若栈2已空,没有元素出栈 52 return "error"; 53 *e=s->data[s->top2++];//将栈1的栈顶元素出栈,再top2加1 54 } 55 return "pop ok";//元素出栈成功 56 } 57 58 int main() 59 { 60 SqDoubleStack *p=NULL; 61 62 //调用初始化函数 63 p=InitSqDoubleStack(p); 64 65 //入栈 66 cout<<"A"<<" "<<Push(p,‘A‘,1)<<" ";//进栈1,A 67 cout<<p->top1<<endl;//top1等于0 68 cout<<"a"<<" "<<Push(p,‘a‘,2)<<" ";//进栈2,a 69 cout<<p->top2<<endl;//top2等于MAXSIZE-1=5 70 cout<<"B"<<" "<<Push(p,‘B‘,1)<<" ";//进栈1,B 71 cout<<p->top1<<endl;//top1等于1 72 cout<<"b"<<" "<<Push(p,‘b‘,2)<<" ";//进栈2,b 73 cout<<p->top2<<endl;//top1等于MAXSIZE-1-1=4 74 75 //出栈 76 char e; 77 char *pe=&e; 78 cout<<Pop(p,pe,1)<<" "; 79 cout<<e<<endl;//栈1,出B 80 cout<<Pop(p,pe,2)<<" "; 81 cout<<e<<endl;//栈2,出b 82 cout<<Pop(p,pe,1)<<" "; 83 cout<<e<<endl;//栈1,出A 84 cout<<Pop(p,pe,2)<<" "; 85 cout<<e<<endl;//栈2,出a 86 cout<<Pop(p,pe,1)<<endl;//栈1已空,元素出栈失败 87 cout<<Pop(p,pe,2)<<endl;//栈2已空,元素出栈失败 88 }
运行结果:
时间: 2024-10-24 05:14:53