栈的定义及相关操作

2020-01-18  本文已影响0人  Jorunk
typedef struct
{
    ElemType *base;
    ElemType *top;
    int stackSize;
}sqStack;
-(ElemType* base 和 ElemType* top)
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int top;        // 用于标注栈顶的位置
int stackSize;
}
#define STACK_INIT_SIZE 100
initStack(sqStack *s)
{
    s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) );
    if( !s->base )
        exit(0);
    s->top = s->base;   // 最开始,栈顶就是栈底
    s->stackSize = STACK_INIT_SIZE;
}


#define SATCKINCREMENT 10

Push(sqStack *s, ElemType e)
{
    // 如果栈满,动态增加空间
    if( s->top - s->base >= s->stackSize )
    {
        s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
        if( !s->base )
            exit(0);

        s->top = s->base + s->stackSize;              // 设置栈顶
        s->stackSize = s->stackSize + STACKINCREMENT; // 设置栈底
    }

    *(s->top) = e;
    s->top++;
}
Pop(sqStack *s, ElemType *e)
{
    if( s->top == s->base )  // 栈已空空是也
        return;
    *e = *--(s->top);
}

ClearStack(sqStack *s){
s->top = s->base;
}
DestroyStack(sqStack *s){
    int i, len;
    len = s->stackSize;
    for( i=0; i < len; i++ ){
        free( s->base );
        s->base++;
    }
    s->base = s->top = NULL;
    s->stackSize = 0;
}
int StackLen(sqStack s)
{
    return(s.top – s.base);  // 初学者需要重点讲解
}


teypedef struct StackNode
{
    ElemType data;  // 存放栈的数据
    struct StackNode *next;
} StackNode, *LinkStackPtr;
teypedef struct LinkStack
{
    LinkStackPrt top;   // top指针
    int count;      // 栈元素计数器
}

Status Push(LinkStack *s, ElemType e)
{
    LinkStackPtr p = (LinkStackPtr) malloc (sizeof(StackNode));
    p->data = e;
    p->next = s->top;
    s->top = p;
    s->count++;
    return OK;
}

Status Pop(LinkStack *s, ElemType *e)
{
    LinkStackPtr p;
    if( StackEmpty(*s) )  // 判断是否为空栈
        return ERROR;
    *e = s->top->data;
    p = s->top;
    s->top = s->top->next;
    free(p);
    s->count--;
    return OK;
}

上一篇 下一篇

猜你喜欢

热点阅读