如果一个程序需要使用多个栈,使用顺序栈就会造成栈空间大小难以估计,从而造成有的栈溢出有的栈空闲,此时可以建立一个共享栈,通俗地讲就是将两个栈的栈底设置在同一个数组的两端,栈顶位置用top1、top2表示。如图:
所以共享栈的数据结构类型为:
#include <cstdio>
#define MAX 10
#define INF 0xfffffff
typedef int DataType;
struct DStack
{
DataType data[MAX];
int top1; //top1从数组头部向尾部移动
int top2; //top2从数组尾部向头部移动
};
基本操作实现:
void InitDStack(DStack &s)
{
s.top1 = 0;
s.top2 = MAX - 1;
}
bool isFull(DStack &s)
{
/*与top的走动方式有关,我这里top1从0开始,
用top1++,所以判断栈满标志为top2跑到top1前面 */
return s.top1 > s.top2 ? true : false;
}
void Push(DStack &s, DataType e, int tag)
{
if(isFull(s))
{
printf("Full!\n");
return ;
}
if(tag)
s.data[s.top1++] = e;
else
s.data[s.top2--] = e;
}
bool isEmpty(DStack &s, int tag)
{
if(tag)
return s.top1 == 0 ? true : false;
else
return s.top2 == MAX - 1 ? true : false;
}
DataType Pop(DStack &s, int tag)
{
if(isEmpty(s, tag))
{
printf("Empty!\n");
return INF;
}
if(tag)
return s.data[--s.top1];
else
return s.data[++s.top2];
}
测试代码:
int main()
{
DStack s;
int t1, t2;
InitDStack(s);
//测试Push
for(int i = 0; i < 5; i++)
{
Push(s, i, 1);
Push(s, 10 - i, 0);
}
for(int i = 0; i < 10; i++)
{
printf("%d ", s.data[i]);
}
printf("\n");
Push(s, 100, 1);
Push(s, 100, 0);
printf("\n\n");
//测试Pop
for(int i = 0; i < 5; i++)
{
t1 = Pop(s, 1);
t2 = Pop(s, 0);
printf("t1 = %d\nt2 = %d\n", t1, t2);
}
t1 = Pop(s, 1);
t2 = Pop(s, 0);
return 0 ;
}