-
Notifications
You must be signed in to change notification settings - Fork 2
/
SharedStack.c
330 lines (304 loc) · 8.83 KB
/
SharedStack.c
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
#include<stdio.h>
/**
* 共享栈能存储的最大元素个数
*/
#define MAXSIZE 100
/**
* 共享栈结构体定义
*/
typedef struct {
/**
* 数据域,存储栈中元素
*/
int data[MAXSIZE];
/**
* 指针域,记录 0 号栈和 1 号栈的栈顶指针
*/
int top[2];
} SharedStack;
/**
* 初始化共享栈
* @param stack 未初始化的共享栈
*/
void init(SharedStack *stack) {
// 1.需要同时初始化 0 号栈和 1 号栈
// 1.1 将 0 号栈的栈顶指针指向 -1,表示 0 号栈是空栈
stack->top[0] = -1;
// 1.2 将 1 号栈的栈顶指针指向 MAXSIZE,表示 1 号栈是空栈
stack->top[1] = MAXSIZE;
}
/**
* 判断指定序号的栈是否是空栈
* @param stack 共享栈
* @param NUM 栈序号,只能传入 0 或者 1
* @return 如果指定栈是空栈则返回 1,否则返回 0 表示非空栈
*/
int isEmpty(SharedStack stack, int NUM) {
if (NUM == 0) {
// 0 号栈为空栈的条件是,栈顶指针指向 -1
return stack.top[0] == -1;
} else if (NUM == 1) {
// 1 号栈为空栈的条件是,栈顶指针指向 MAXSIZE
return stack.top[1] == MAXSIZE;
} else {
// 随便返回一个数,表示传入的序号不合法
return -MAXSIZE;
}
}
/**
* 判断共享栈是否是满
* @param stack 共享栈
* @return 如果是栈满则返回 1,否则返回 0 表示栈未满
*/
int isFull(SharedStack stack) {
// 如果 0 号栈和 1 号栈的栈顶元素相邻,则表示栈已满
if (stack.top[1] - stack.top[0] == 1) {
return 1;
} else {
return 0;
}
}
/**
* 将元素压入栈
* @param stack 共享栈
* @param NUM 栈序号,只能传入 0 或者 1
* @param ele 新元素
* @return 如果栈满则返回 0 表示入栈失败;入栈成功则返回 1
*/
int push(SharedStack *stack, int NUM, int ele) {
// 0.参数校验,如果栈满则不能入栈
if (isFull(*stack)) {
return 0;
}
// 1.根据栈序号是 0 还是 1,来决定将元素存入哪个栈
// 1.1 将元素存入 0 号栈
if (NUM == 0) {
// 1.1.1 先移动 0 号栈的栈顶指针。由于 0 号栈是从 -1 开始的,所以栈顶指针是往后增
stack->top[0]++;
// 1.1.2 再赋值
stack->data[stack->top[0]] = ele;
}
// 1.2 将元素存入 1 号栈
else if (NUM == 1) {
// 1.2.1 先移动 1 号栈的栈顶指针。由于 1 号栈是从 MAXSIZE 开始的,所以栈顶指针是往前减
stack->top[1]--;
// 1.2.2 再赋值
stack->data[stack->top[1]] = ele;
}
return 1;
}
/**
* 将元素出栈
* @param stack 共享栈
* @param NUM 栈序号,只能传入 0 或者 1
* @param ele 用来保存出栈元素
* @return 如果栈空则返回 0 表示出栈失败;否则返回 1 表示出栈成功
*/
int pop(SharedStack *stack, int NUM, int *ele) {
// 0.参数校验,如果任何一个栈栈空则不能出栈
if (isEmpty(*stack, NUM)) {
return 0;
}
// 1.根据栈序号来决定将哪个栈的栈顶元素出栈
// 1.1 如果要将 0 号栈的栈顶元素出栈
if (NUM == 0) {
// 1.1.1 用 ele 保存 0 号栈的栈顶元素
*ele = stack->data[stack->top[0]];
// 1.1.2 移动栈顶指针删除元素
stack->top[0]--;
}
// 1.2 如果要将 1 号栈的栈顶元素出栈
else if (NUM == 1) {
// 1.2.1 用 ele 保存 1 号栈的栈顶元素
*ele = stack->data[stack->top[1]];
// 1.2.2 移动栈顶指针删除元素
stack->top[1]++;
}
return 1;
}
/**
* 获取指定序号栈的栈顶元素,但不出栈
* @param stack 共享栈
* @param NUM 栈序号,只能传入 0 或者 1
* @param ele 用来保存栈顶元素
* @return 如果栈空则返回 0 表示出栈失败;否则返回 1 表示出栈成功
*/
int getTop(SharedStack stack, int NUM, int *ele) {
// 0.参数校验,如果任何一个栈栈空则不能出栈
if (isEmpty(stack, NUM)) {
return 0;
}
// 1.用 ele 保存栈顶元素
// 1.1 用 ele 保存 0 号栈的栈顶元素
if (NUM == 0) {
*ele = stack.data[stack.top[0]];
}
// 1.2 用 ele 保存 1 号栈的栈顶元素
else if (NUM == 1) {
*ele = stack.data[stack.top[1]];
}
return 1;
}
/**
* 获取共享栈中指定序号栈的元素个数
* @param stack 共享栈
* @param NUM 栈序号,只能传入 0 或者 1
* @return 指定序号栈的元素个数
*/
int size(SharedStack stack, int NUM) {
// 变量,记录栈中结点个数
int len = 0;
// 1.获取指定序号栈的元素个数
// 1.1 获取 0 号栈的元素个数
if (NUM == 0) {
// 下标从 0 开始,所以元素个数就是下标加一
len = stack.top[0] + 1;
}
// 1.2 获取 1 号栈的元素个数
else if (NUM == 1) {
// 1 号栈的元素从后往前,所以计算栈的元素个数是 MAXSIZE 减去 1 号栈的栈顶指针
len = MAXSIZE - stack.top[1];
}
return len;
}
/**
* 打印指定序号栈中的所有元素
* @param stack 共享栈
* @param NUM 栈序号,只能传入 0 或者 1
*/
void print(SharedStack stack, int NUM) {
printf("[");
// 变量,记录栈顶指针
int top;
if (NUM == 0) {
top = stack.top[0];
for (int i = top; i >= 0; i--) {
printf("%d", stack.data[i]);
if (i != 0) {
printf(", ");
}
}
} else if (NUM == 1) {
top = stack.top[1];
for (int i = top; i < MAXSIZE; i++) {
printf("%d", stack.data[i]);
if (i != MAXSIZE - 1) {
printf(", ");
}
}
}
printf("]\n");
}
/**
* 清空 0 号栈的所有元素
* @param stack 共享栈
* @param NUM 栈序号,只能传入 0 或者 1
*/
void clear(SharedStack *stack, int NUM) {
if (NUM == 0) {
// 直接将 0 号的栈顶指针指向 -1,就表示是空栈
stack->top[0] = -1;
} else if (NUM == 1) {
// 直接将 1 号的栈顶指针指向 MAXSIZE,就表示是空栈
stack->top[1] = MAXSIZE;
}
}
int main() {
// 声明并初始化共享栈
SharedStack stack;
init(&stack);
// 将元素存入0号栈
printf("\n将元素存入0号栈:\n");
push(&stack, 0, 11);
print(stack, 0);
push(&stack, 0, 22);
print(stack, 0);
push(&stack, 0, 33);
print(stack, 0);
push(&stack, 0, 44);
print(stack, 0);
push(&stack, 0, 55);
print(stack, 0);
// 将元素存入1号栈
printf("\n将元素存入1号栈:\n");
push(&stack, 1, 555);
print(stack, 1);
push(&stack, 1, 444);
print(stack, 1);
push(&stack, 1, 333);
print(stack, 1);
push(&stack, 1, 222);
print(stack, 1);
push(&stack, 1, 111);
print(stack, 1);
// 共享栈是否满
printf("\n共享栈是否满:\n");
int full;
full = isFull(stack);
printf("%d\n", full);
// 将0号栈的元素出栈
printf("\n将0号栈的元素出栈:\n");
int top0;
pop(&stack, 0, &top0);
printf("top0: %d\n", top0);
print(stack, 0);
pop(&stack, 0, &top0);
printf("top0: %d\n", top0);
print(stack, 0);
pop(&stack, 0, &top0);
printf("top0: %d\n", top0);
print(stack, 0);
// 将1号栈的元素出栈
printf("\n将1号栈的元素出栈:\n");
int top1;
pop(&stack, 1, &top1);
printf("top1: %d\n", top1);
print(stack, 1);
pop(&stack, 1, &top1);
printf("top1: %d\n", top1);
print(stack, 1);
pop(&stack, 1, &top1);
printf("top1: %d\n", top1);
print(stack, 1);
// 0号栈是否空
printf("\n0号栈是否空:\n");
int empty0;
empty0 = isEmpty(stack, 0);
printf("%d\n", empty0);
// 1号栈是否空
printf("\n1号栈是否空:\n");
int empty1;
empty1 = isEmpty(stack, 1);
printf("%d\n", empty1);
// 获取0号栈栈顶元素
printf("\n获取0号栈栈顶元素:\n");
getTop(stack, 0, &top0);
printf("%d\n", top0);
// 获取1号栈栈顶元素
printf("\n获取1号栈栈顶元素:\n");
getTop(stack, 1, &top1);
printf("%d\n", top1);
// 获取0号栈中元素个数
printf("\n获取0号栈中元素个数:\n");
int len0;
len0 = size(stack, 0);
printf("%d\n", len0);
// 获取1号栈中元素个数
printf("\n获取1号栈中元素个数:\n");
int len1;
len1 = size(stack, 1);
printf("%d\n", len1);
// 获取共享栈中的总元素个数
printf("\n获取共享栈中的总元素个数:\n");
int len;
len = size(stack, 0) + size(stack, 1);
printf("%d\n", len);
// 清空0号栈
printf("\n清空0号栈:\n");
clear(&stack, 0);
print(stack, 0);
// 清空1号栈
printf("\n清空1号栈:\n");
clear(&stack, 1);
print(stack, 1);
}