标签:
参考《大话数据结构》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 }
运行结果:
标签:
原文地址:http://www.cnblogs.com/hslzju/p/5405824.html