栈(可运行完整代码)

栈的具体原理就不讲了,其主要特点是Last in First Out(LIFO),只在末尾(栈顶)进行删除和插入操作。
看书的时候发现两个比较细节的东西(了解即可)分享给大家:
用链表实现的栈的缺点在于对malloc和free函数的调用的开销是昂贵的;
用数组实现的栈的潜在危害是需要提前申明一个数组的大小,除此之外,
还要对pop空栈与push满栈进行错误检测,会花费较多的时间
下面贴出代码,代码只是简单的实现了push和pop操作,具体如下:

#include <stdio.h>
#include <stdlib.h>

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define Status int
#define OK 1
#define ERROR 0

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

Status InitStack(SqStack *S);
Status Push(SqStack *S,int e);
Status Pop(SqStack *S,int *e);
int getLength(SqStack *S);

int main()
{
    SqStack S;
    int a,i,length,num[5]={1,2,3,4,5};

    InitStack(&S);
    for(i = 0 ; i < 5; i++) {
        Push(&S,num[i]);
    }

    length = getLength(&S);
    for(i=0;i<length;i++) {
        Pop(&S,&a);
        printf("%d ",a);
    }

    return 1;
}


Status InitStack(SqStack *S) {
    S->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));

    if (!S->base) {
        exit(0);
    }

    S->top = S->base;
    S->stacksize =  STACK_INIT_SIZE;

    return OK;
}

Status Push(SqStack *S,int e) {
    if (S->top - S->base >= S->stacksize)
    {
        S->base = (int *)realloc(S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));

        if(!S->base)
        {
            exit(0);
        }
        S->top = S->base + S->stacksize;
        S->stacksize += STACKINCREMENT;
    }

    *(S->top) = e;
    S->top++;

    return OK;
}

Status Pop(SqStack *S,int *e) {
    if (S->top == S->base) {
        return ERROR;
    }
    *e = *--S->top;

    return OK;
}

int getLength(SqStack *S) {
    return S->top - S->base;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值