1 思路
如果有兩個類型相同的棧,我們為它們分別開辟了數組空間。極有可能是一個棧已經滿了,再入棧就溢出了,而另一個棧卻還有很多存儲空間。這又何必呢?我們完全可以用一個數組來存儲兩個棧,只不過需要一些小的技巧。
我們的做法如下,數組有兩個端點,兩個棧有兩個棧底。讓一個棧的棧底為數組的始端,即數組下標為0的位置。讓另一個棧的棧底為數組的末端,即數組下標為n-1的位置。這樣如果兩個棧增加元素,就是兩端點向中間延伸。
其實關鍵思路是:它們是在數組的兩端,向中間靠攏。top1和top2是兩個棧的棧頂指針。只要它們兩個不見面,兩個棧就可以一直使用。
2 兩棧共享空間的結構代碼
typedef struct { SElemType data[MAXSIZE]; int top1; //棧1的棧頂指針(top1==-1,表示棧1為空) int top2; //棧2的棧頂指針(top2==MAXSIZE,表示棧2為空) }SqDoubleStack;
3 入棧操作
Status push(SqDoubleStack *S, SElemType e, int stackNumber) { if (S->top1 + 1 == S->top2) { //棧滿 return ERROR; } if (stackNumber == 1) { //表示棧1有元素進棧 top1 ++; S->data[top1] = e; } else if (stackNumber == 2) { //表示棧2有元素進棧 top2--; S->data[top2] = e; } return OK; }
4 出棧操作
Status Pop(SqDoubleStack *S, SElemType *e, int stackNumber) { if (stackNumber == 1) { //說明是刪除棧1元素 if (S->top1 == -1) { //棧1空 return ERROR; } *e = S->data[S->top1] S->top1--; } else if (stackNumber == 2) { //說明是刪除棧2元素 if (S->top2 == MAXSIZE) { //棧2空 return ERROR; } *e = S->data[S->top2]; S->top2++; } return OK; }