用C语言实现双栈结构
【问题描述】
将编号为0和1的两个栈存放于一个数组空间V[m]中,栈底分别处于数组的两端。当第0号栈的栈顶指针top[0]等于-1时该栈为空;当第1号栈的栈顶指针top[1]等于m时,该栈为空。两个栈均从两端向中间增长。试编写双栈初始化,判断栈空、栈满、进栈和出栈等算法的函数。
注意初始化时一定要先为结构体分配空间
DblStack *b;
b = (DblStack*)malloc(sizeof(DblStack));
用"->''此时前面应为结构体的指针,若用".",则前面应为结构体(形参时用“b”,实参时则用“&b”)*
完整代码如下(附注释和测试代码)
#include
#include
#define MAXSIZE 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef int Status;
typedef int SElemType;
typedef struct
{
int top[2], bot[2];
SElemType *V;
int m;
}DblStack;
//双栈初始化
Status InitStack(DblStack **b)
{
(*b)->V = (SElemType*)malloc(MAXSIZE * sizeof(SElemType));
if (!b) exit(OVERFLOW);
(*b)->bot[0] = -1;
(*b)->bot[1] = MAXSIZE;
(*b)->top[0] = (*b)->bot[0];
(*b)->top[1] = (*b)->bot[1];
(*b)->m = MAXSIZE;
return OK;
}
//栈空
Status StackEmpty(DblStack *b)
{
if ((b->top[0] == b->bot[0]) && (b->top[1] == b->bot[1]))
{
return OK;
}
else
{
return ERROR;
}
}
//栈满
Status StackFull(DblStack *b)
{
if (b->top[0] == b->top[1] - 1)
{
return OK;
}
else
{
return ERROR;
}
}
//入栈
Status Push(DblStack **b, SElemType e, int number)
{
if (StackFull(*b))
{
exit(OVERFLOW);
}
if (number == 0)
{
(*b)->top[0] = (*b)->top[0] + 1;
}
else if (number == 1)
{
(*b)->top[1] = (*b)->top[1] - 1;
}
(*b)->V[(*b)->top[number]] = e;
return OK;
}
//出栈
Status Pop(DblStack **b, SElemType *e, int number)
{
if (StackEmpty(*b))
{
return ERROR;
}
*e = (*b)->V[(*b)->top[number]];
if (number == 0)
{
(*b)->top[0] = (*b)->top[0] - 1;
}
else if (number == 1)
{
(*b)->top[1] = (*b)->top[1] + 1;
}
return OK;
}
//测试
int main()
{
DblStack *b;
b = (DblStack*)malloc(sizeof(DblStack));
if (InitStack(&b))
{
printf("初始化完成,最大容量为%d\n",MAXSIZE);
}
if (StackEmpty(b))
{
printf("Empty\n");
}
int n;
while (1)
{
scanf_s("%d", &n);
if (Push(&b, n, 0))
{
printf("%d ", n);
}
if (getchar() == '\n')
{
break;
}
}
printf("\n");
if (StackFull(b))
{
printf("Full\n");
}
while ((b->top[0]) != (b->bot[0]))
{
if (Pop(&b, &n, 0))
{
printf("%d ", n);
}
}
return 0;
}
测试结果:
测试结果
越努力,越幸运
end~~~