用一个数组来实现两个栈,数组的头和尾分别为两个栈底。入栈的时候将数据分别从数组的头尾向中间存放。
当栈顶1在栈顶2右边的时候说明栈已满。因为要实现两个栈,我们可以定义一个变量,来判断我们对哪一个栈来进行操作。
结构体定义以及函数声明部分:
#define MAX 10
typedef int DataType;
typedef struct Stack
{
DataType* _array;
size_t _top1;
size_t _top2;//栈顶
}Stack;
void StackInit(Stack* s);//初始化
int isfull(Stack *s);//判断栈是否满
void StackPush(Stack* s, DataType x,int n);//入栈
int isEmpty(Stack*s, int n);//判断是否为空
void StackPop(Stack* s,int n);//出栈
函数实现:
void StackInit(Stack* s)
{
s->_array = (DataType*)malloc(sizeof(DataType)*MAX);
assert(s->_array);
s->_top1 = 0;
s->_top2 = MAX - 1;
}
int isfull(Stack *s)
{
assert(s);
if (s->_top1 <= s->_top2)
return 0;
else
return 1;
}
void StackPush(Stack* s, DataType x, int n)
{
assert(s);
if (isfull(s) == 1)
{
printf("stack is full!\n");
return;
}
if (n)
{
s->_array[s->_top1] = x;
s->_top1++;
}
else
{
s->_array[s->_top2] = x;
s->_top2--;
}
}
int isEmpty(Stack*s, int n)
{
assert(s);
if (n)
{
if (s->_top1 == 0)
return 1;
else
return 0;
}
else
{
if (s->_top2 == MAX - 1)
return 1;
else
return 0;
}
}
void StackPop(Stack* s, int n)
{
assert(s);
if (isEmpty(s) == 1)
{
printf("stack is empty!\n");
return;
}
if (n)
{
s->_top1--;
}
else
{
s->_top2++;
}
}