源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# include<iostream>
# define MAXSIZE 10
using namespace std;

typedef int SElemType;//栈中元素类型

//1.共享栈的结构定义

typedef struct StackNode
{
SElemType data[MAXSIZE];

int top1;//Stack1的栈顶指针

int top2;//Stack2的栈顶指针

}DoubleStack;

//用 DoubleStack 来代替 struct StackNode

//共享栈的初始化操作

void InitStack(DoubleStack* s)

{

s->top1 = -1; // 初始化一号栈的栈顶指针

s->top2 = MAXSIZE; // 初始化二号栈的栈顶指针

}

//2.共享栈的入栈操作

//ps:要传入栈的结构体指针,即&s,以及要入栈的元素,要入栈的栈号

bool Push(DoubleStack * s, SElemType e,int stacknumber)

{

//[1]判断两个栈是否栈满

if (s->top1 + 1 == s->top2){

printf("栈满!\n");

return false;
}

//[2]若给一号栈入栈,进行一号栈的入栈操作

if(stacknumber == 1){

//<1>栈顶指针后移

s->top1++;

//<2>为当前栈顶空间赋值

s->data[s->top1] = e;

//两步可以合并为一步:
//s->data[++s->top1];先移动栈顶指针,再赋值

return true;
}

//[3]若给二号栈入栈,进行二号栈的入栈操作

else if (stacknumber == 2){

//<1>栈顶指针前移

s->top2--;

//<2>为当前栈顶空间赋值

s->data[s->top2] = e;

//两步可以合并为一步:

//s->data[--s->top2];先移动栈顶指针,再赋值

return true;
}

else{

return false;//错误的栈编号!
}
}

//3.共享栈的出栈Pop操作

bool Pop(DoubleStack* s,SElemType* e,int stacknumber){

if(stacknumber == 1)
{

//a.如果栈为空,则返回false
if (s->top1 == -1){
printf("栈空!\n");
return false;
}

//b.将当前栈顶原色赋值给e

*e = s->data[s->top1];
s->top1--;
//这一步也可以合并为一步:
//*e = s->data[s->top1--];
}



else if(stacknumber == 2){

//a.如果栈为空,则返回false
if (s->top2 == MAXSIZE){

printf("栈空!\n");
return false;
}

//b.将当前栈顶原色赋值给e

*e = s->data[s->top2];
s->top2++;
//这一步也可以合并为一步:
//*e = s->data[s->top2++];
}

else{
return false;//输入了错误的栈编号
}

return true;

}

int main()

{
DoubleStack s1; // 声明一个共享栈

InitStack(&s1); // 初始化共享栈

cout<<"请输入是s1的数据"<<endl;
for(int i = 0;i<5;i++){
SElemType a=0;
cin>>a;
Push(&s1, a, 1);

}

cout<<"请输入是s2的数据"<<endl;

for(int i = 0;i<6;i++){

SElemType b=0;
cin>>b;
Push(&s1, b, 2);
}

SElemType e;

Pop(&s1, &e, 1);
printf("栈1出栈元素:%d\n", e);

Pop(&s1, &e, 2);
printf("栈2出栈元素:%d\n", e);

return 0;

}

待完善