顺序栈的编写与实现

/*栈:
**也可以看作线性表,其特殊行在于
**栈是线性表操作的子集,是操作受限的线性表
**因此,可称为限定性的数据结构
**一般来说,在初始化设空栈时不应该限定栈的最大容量
**先为栈分配一个基本容量,不够用时再逐段扩大
**当 base = NULL 时,表明栈结构不存在
** base = top 时,表明栈空
*/

#include <stdlib.h>
#define TRUE    1
#define FALSE   0
#define OK      1
#define ERROR   0
#define OVERFLOW    -1
#define INFEASIBLE  -2
#define INIT_STACK_SIZE     100
#define INCREAMENTSTACK     10

typedef int SElemType;
typedef int Status;

typedef struct{
    SElemType *top;
    SElemType *base;
    int stacksize;
}SqStack;

//构造一个空栈
Status InitStack( SqStack &S ){
    S.base = S.top = (SElemType*) malloc (sizeof(SElemType));
    if( !S.top )
        return ERROR;
    S.stacksize = INIT_STACK_SIZE;
    return OK;
}

// 把 S 设置为空栈
Status ClearStack( SqStack &S ){
    SElemType *p, *q;
    q = p = S.top - 1;
    while( S.top != S.base ){
        q = p - 1;
        free(p);
        p = q;
        S.top--;
    }
    free(q);
    return OK;
}

//销毁 S 
Status DestroyStack( SqStack &S ){
    ClearStack(S);
    free(S.top);
    free(S.base);
    return OK;
}

//若栈 S 为空栈,则返回TRUE, 否则返回 FALSE
Status StackEmpty( SqStack S ){
    if( S.top == S.base )
        return TRUE;
    else
        return FALSE;
}

//返回 S 的元素个数,即栈的长度
int StackLength( SqStack S ){
    return ( S.top - S.base );
}

//若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK, 否则返回ERROR
Status GetTop( SqStack S, SElemType &e ){
    if( S.top != S.base ){
        e = *(S.top - 1);
        return OK;
    }
    else
        return ERROR;
}

//若栈不空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK;否则返回 ERROR
Status Pop( SqStack &S, SElemType &e ){
    if( StackLength(S) ){
        e = *(S.top - 1);
        *--S.top;
        return OK;
    }
    else
        return ERROR;
}

//插入元素 e 为新的栈顶元素
Status Push( SqStack &S, SElemType e ){
    if( StackLength(S) >= S.stacksize ){
        S.base = (SElemType*) realloc (S.base,INCREAMENTSTACK * sizeof(SElemType));
        S.stacksize += INCREAMENTSTACK;
    }
    *S.top = e;
    S.top++;
    return OK;
}

顺序栈的实现

#include <stdio.h>
#include "Stack.h"
int main(void)
{
    SqStack S;

    //Initilize a empty Stack
    InitStack( S );
    printf("top = %u, base = %u, stacksize = %d\n",
        S.top, S.base, S.stacksize);

    //Push 5 elements into S
    for( int i = 0; i < 5; ++i ){
        Push(S,i);
        printf("%d ",*(S.top - 1));
    }
    putchar('\n');

    //return length of Stack S
    printf("S.length = %d\n",StackLength(S));

    //Get the top element from S
    SElemType get_e;
    GetTop(S,get_e);
    printf("The top element is %d\n",get_e);

    //Pop the top element 
    SElemType pop_e;
    Pop(S,pop_e);
    printf("Pop element is %d\n",pop_e);

    //Check the S 
    for( int i = 0; i < StackLength(S); ++i ){
        printf("%d ",*(S.top - 1 - i));
    }
    return 0;
}

哎呀。。。最近懒了好多,要好好反省一下。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值