當兩個棧的總元素數量固定但各自增減不均時,分別分配固定空間會導致浪費。雙棧共享一個陣列,一端向右增長,一端向左增長,動態平衡空間使用。
#define MAXSIZE 100
typedef int SElemType;
typedef struct {
SElemType data[MAXSIZE];
int top1; // 棧1棧頂索引,初始 -1
int top2; // 棧2棧頂索引,初始 MAXSIZE
} SqDoubleStack;
Status InitStack(SqDoubleStack *S) {
S->top1 = -1;
S->top2 = MAXSIZE;
return OK;
}
Status StackEmpty(SqDoubleStack S) {
return (S.top1 == -1 && S.top2 == MAXSIZE) ? TRUE : FALSE;
}
Status Push(SqDoubleStack *S, SElemType e, int stackNumber) {
if (S->top1 + 1 == S->top2) return ERROR; // 棧滿:相遇無空位
if (stackNumber == 1) {
S->data[++S->top1] = e; // 棧1向右:先增後存
} else if (stackNumber == 2) {
S->data[--S->top2] = e; // 棧2向左:先減後存
}
return OK;
}
Status Pop(SqDoubleStack *S, SElemType *e, int stackNumber) {
if (stackNumber == 1) {
if (S->top1 == -1) return ERROR;
*e = S->data[S->top1--]; // 取值後棧頂左移
} else if (stackNumber == 2) {
if (S->top2 == MAXSIZE) return ERROR;
*e = S->data[S->top2++]; // 取值後棧頂右移
}
return OK;
}
Status StackTraverse(SqDoubleStack S) {
int i = 0;
while (i <= S.top1) { visit(S.data[i++]); } // 棧1:從底到頂
i = S.top2;
while (i < MAXSIZE) { visit(S.data[i++]); } // 棧2:從底到頂(索引遞增)
printf("\n");
return OK;
}
可推廣至 N 棧共享一個陣列,需維護 N 個 top 指針,入棧時尋找相鄰棧間隙,複雜度較高,通常用鏈表實現更靈活。