順序存儲的共享棧本質上就是把一個數組兩端分別當成一個棧,這兩個棧共用一塊存儲空間。
#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;
}