顺序存储的共享栈本质上就是把一个数组两端分别当成一个栈,这两个栈共用一块存储空间。
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 20
#define ElemType int
typedef struct{
ElemType data[MaxSize];
int top0; // 0号栈顶指针
int top1; // 1号栈顶指针
} ShareStack;
// 初始化操作
void StackInit(ShareStack &s)
{
s.top0 = -1;
s.top1 = MaxSize;
}
// 入栈,两个入栈操作函数构成重载,用最后是否有一个int参数来判断
// 此种方法可以参考++或--运算符的前缀后缀重载方法
bool StackPush(ShareStack &s, ElemType e) // 没有int参数,在top0方向入栈
{
if(s.top0 +1 == s.top1){ // 栈满
return false;
}
s.data[++s.top0] = e;
return true;
}
bool StackPush(ShareStack &s, ElemType e, int)// 有int参数,在top1方向入栈
{
if(s.top0 +1 == s.top1){ // 栈满
return false;
}
s.data[--s.top1] = e;
return true;
}
// 出栈
bool StackPop(ShareStack &s)
{
if(s.top0 == -1){
return false;
}
s.top0 --;
return true;
}
bool StackPop(ShareStack &s, int)
{
if(s.top1 == MaxSize){
return false;
}
s.top1 ++;
return true;
}
// 判断栈是否为空
bool StackIsEmpty(ShareStack &s)
{
return (s.top0 == -1 && s.top1 == MaxSize) ? true : false;
}
int main()
{
ShareStack s;
StackInit(s);
for(int i = 0; i < 10; i++){
StackPush(s, i+1);
}
for(int i = 0; i < 10; i++){
StackPush(s, i+1, 1);
}
for(int i = 0; i < 20; i++){
printf("%d ", s.data[i]);
}
return 0;
}