您的位置:首页 > 其它

在一个数组中实现两个堆栈

2017-04-13 00:22 381 查看
本题要求在一个数组中实现两个堆栈。

函数接口定义:

Stack CreateStack( int MaxSize );
bool Push( Stack S, ElementType X, int Tag );
ElementType Pop( Stack S, int Tag );


其中
Tag
是堆栈编号,取1或2;
MaxSize
堆栈数组的规模;
Stack
结构定义如下:

typedef int Position;
struct SNode {
ElementType *Data;
Position Top1, Top2;
int MaxSize;
};
typedef struct SNode *Stack;


注意:如果堆栈已满,
Push
函数必须输出“Stack Full”并且返回false;如果某堆栈是空的,则
Pop
函数必须输出“Stack Tag Empty”(其中Tag是该堆栈的编号),并且返回ERROR。

这个题其实很坑啊,我自己写的方式也是可以的,但是这个题的
PrintStack
写法和我的不一样,所以导致我的一直超时。

标准实现:

Stack CreateStack( int MaxSize )
{
Stack ret = (Stack)malloc(sizeof(struct SNode));
ret->Data = (ElementType *)malloc(sizeof(ElementType) * MaxSize);
ret->Top1 = -1;
ret->Top2 = MaxSize;
ret->MaxSize = MaxSize;
return ret;
}

bool Push( Stack S, ElementType X, int Tag )
{
if (S->Top1 + 1 == S->Top2) {
puts("Stack Full");
return false;
}
if (Tag == 1)
S->Data[++S->Top1] = X;
else
S->Data[--S->Top2] = X;
return true;
}

ElementType Pop( Stack S, int Tag )
{
if (Tag == 1) {
if (S->Top1 == -1) {
printf("Stack %d Empty\n", Tag);
return ERROR;
}
return S->Data[S->Top1--];
} else {
if (S->Top2 == S->MaxSize) {
printf("Stack %d Empty\n", Tag);
return ERROR;
}
return S->Data[S->Top2++];
}
}


我的实现:

Stack CreateStack( int MaxSize )
{
Stack ret = (Stack)malloc(sizeof(struct SNode));
ret->Data = (ElementType *)malloc(sizeof(ElementType) * MaxSize);
ret->Top1 = 0;
ret->Top2 = 0;
ret->MaxSize = MaxSize;
return ret;
}

bool Push( Stack S, ElementType X, int Tag )
{
if (S->Top1 + S->Top2 == S->MaxSize) {
puts("Stack Full");
return false;
}
if (Tag == 1)
S->Data[S->Top1++] = X;
else
S->Data[S->MaxSize - 1 - S->Top2++] = X;
return true;
}

ElementType Pop( Stack S, int Tag )
{
if (Tag == 1) {
if (S->Top1 == 0) {
printf("Stack %d Empty\n", Tag);
return ERROR;
}
return S->Data[--S->Top1];
} else {
if (S->Top2 == 0) {
printf("Stack %d Empty\n", Tag);
return ERROR;
}
return S->Data[S->MaxSize - 1 - (--S->Top2)];
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: