關鍵思路:
1.兩棧的棧頂指針top1,和top2,分別由數組兩端向中間靠攏,如果top1 + 1 == top2(兩個指針相遇)即爲棧滿的判定條件。
2.棧1爲空時 top1 = -1; 棧2爲空時 top2 = MAXSIZE(即數組的最大長度)。
3.設置判定條件,如果兩個棧頂指針不相遇,則該棧就可以一直使用。
實現代碼如下:
#include <stdio.h>
#define MAXSIZE 1024
#define OK 1
#define ERROR 0
// 兩棧共享空間
typedef struct
{
int data[MAXSIZE];
int top1; // 棧1棧頂指針
int top2; // 棧2棧頂指針
}SqDoubleStack;
int Push(SqDoubleStack *s, int e, int StackNumber) // 入棧 StackNumber用來判斷是棧1還是棧2
{
if(s->top1 + 1 == s->top2)
{
printf("棧滿!\n");
return ERROR;
}
if(StackNumber == 1) // 棧1入棧
{
s->data[++s->top1] = e;
}
else if(StackNumber == 2) //棧2入棧
{
s->data[--s->top2] = e;
}
return OK;
}
int Pop(SqDoubleStack *s, int *e, int StackNumber) // 出棧
{
if(StackNumber == 1) // 棧1出棧
{
if(s->top1 == -1)
{
printf("棧1是空棧!\n");
return ERROR;
}
*e = s->data[s->top1--]; //返回棧頂元素
}
else if(StackNumber == 2)
{
if(s->top2 == MAXSIZE)
{
printf("棧2是空棧!\n");
return ERROR;
}
*e = s->data[s->top2++];
}
return OK;
}
int main()
{
SqDoubleStack s;
s.top1 = -1;
s.top2 = MAXSIZE;
int i,j,k,y;
int e;
for(i = 0; i < 10; i++)
{
Push(&s, i, 1); // 棧1入棧
Push(&s, i, 2); // 棧2入棧
}
printf("棧1:");
for(k = 0; k < 10; k++)
{
Pop(&s, &e, 1);
printf("%d", e);
}
printf("\n");
printf("棧2:");
for(y = 0; y < 10; y++)
{
Pop(&s, &e, 2);
printf("%d", e);
}
printf("\n");
return 0;
}