实现一个共享栈及基本操作
时间: 2023-06-23 12:10:28 浏览: 110
共享栈是指两个栈共享同一块内存空间,它们分别从两端开始向中间生长,当两个栈的栈顶指针相遇时,就称为栈满。共享栈的基本操作包括:初始化、入栈、出栈、判断栈空和栈满、获取栈顶元素等。
下面是共享栈的实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int top1; // 栈1的栈顶指针
int top2; // 栈2的栈顶指针
} ShareStack;
// 初始化共享栈
void initShareStack(ShareStack *s) {
s->top1 = -1; // 栈1的栈顶指针初始化为-1
s->top2 = MAXSIZE; // 栈2的栈顶指针初始化为MAXSIZE
}
// 判断栈1是否为空
int isStack1Empty(ShareStack *s) {
return s->top1 == -1;
}
// 判断栈2是否为空
int isStack2Empty(ShareStack *s) {
return s->top2 == MAXSIZE;
}
// 判断共享栈是否已满
int isShareStackFull(ShareStack *s) {
return s->top1 + 1 == s->top2;
}
// 共享栈入栈操作
int pushShareStack(ShareStack *s, int stackNo, int x) {
if (isShareStackFull(s)) {
printf("Share Stack is full!\n");
return 0;
}
if (stackNo == 1) { // 向栈1中入栈
s->data[++s->top1] = x;
} else if (stackNo == 2) { // 向栈2中入栈
s->data[--s->top2] = x;
} else {
printf("Invalid stack number!\n");
return 0;
}
return 1;
}
// 栈1出栈操作
int popStack1(ShareStack *s, int *x) {
if (isStack1Empty(s)) {
printf("Stack1 is empty!\n");
return 0;
}
*x = s->data[s->top1--];
return 1;
}
// 栈2出栈操作
int popStack2(ShareStack *s, int *x) {
if (isStack2Empty(s)) {
printf("Stack2 is empty!\n");
return 0;
}
*x = s->data[s->top2++];
return 1;
}
// 获取栈1的栈顶元素
int getStack1Top(ShareStack *s, int *x) {
if (isStack1Empty(s)) {
printf("Stack1 is empty!\n");
return 0;
}
*x = s->data[s->top1];
return 1;
}
// 获取栈2的栈顶元素
int getStack2Top(ShareStack *s, int *x) {
if (isStack2Empty(s)) {
printf("Stack2 is empty!\n");
return 0;
}
*x = s->data[s->top2];
return 1;
}
int main(void) {
ShareStack s;
initShareStack(&s);
pushShareStack(&s, 1, 10);
pushShareStack(&s, 2, 20);
pushShareStack(&s, 1, 30);
pushShareStack(&s, 2, 40);
int x;
popStack1(&s, &x);
printf("%d\n", x);
popStack2(&s, &x);
printf("%d\n", x);
getStack1Top(&s, &x);
printf("%d\n", x);
getStack2Top(&s, &x);
printf("%d\n", x);
return 0;
}
```
上面的代码实现了共享栈的基本操作,包括初始化、入栈、出栈、判断栈空和栈满、获取栈顶元素等。其中,栈1的栈顶指针从数组的左边开始,栈2的栈顶指针从数组的右边开始,两个栈向中间生长。
阅读全文