认识共享栈
共享栈的本质就是一个数组存放两个栈,公用一个数组空间。由于顺序栈是创建时就固定了空间大小,而这些空间通常不会一下用完,共享栈可以提高空间的利用率。
通过设置两个栈顶游标即可很容易得把数组空间分成两个部分来操作管理。
基本操作
由于有两个栈,所以操作函数要写两遍分别对不同的栈进行操作。在主函数调用的时候可以使用函数指针(链接: C语言指针入门.)方便操作。
入栈
// 入栈
// A栈
bool PushA(ShStack *S, ElemType e){
if((*S).topA + 1 == (*S).topB) return false; // 栈满,返回错误
(*S).data[++(*S).topA] = e; // 数据存入
return true;
}
// B栈
bool PushB(ShStack *S, ElemType e){
// (*S).topA 和 S->topA 等价
if(S->topA + 1 == S->topB) return false; // 栈满,返回错误
S->data[--S->topB] = e;
return true;
}
出栈
// 出栈
// A栈
bool PopA(ShStack *S, ElemType *e){
if(S->topA == -1) return false; //判空
*e = S->data[S->topA--];
return true;
}
// B栈
bool PopB(ShStack *S, ElemType *e){
if(S->topB == MaxSize) return false; //判空
*e = S->data[S->topB++];
return true;
}
读取栈顶元素
// 读取栈顶元素
void GetTop(ShStack S, ElemType *top_A, ElemType *top_B){
// 同时获取两个栈的栈顶
if(S.topA == -1){
// A栈判空
printf("StackA is empty!\n");
}else{
*top_A = S.data[S.topA]; // 获取栈顶数据,通过指针返回
}
if(S.topB == MaxSize){
// B栈判空
printf("StackB is empty!\n");
}else{
*top_B = S.data[S.topB]; // 获取栈顶数据,通过指针返回
}
}
输出栈
// 输出栈
void PrintStack(ShStack S){
int a = S.topA + 1;
int b = MaxSize - S.topB;
if(S.topA == -1