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

来源:互联网 发布:eclipse怎么写java程序 编辑:程序博客网 时间:2024/04/30 03:39

本题要求在一个数组中实现两个堆栈。

函数接口定义:

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)];    }}
0 0