关键思路:
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;
}