栈的顺序存储

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

typedef int ElemType;
#define MAXSIZE 20  //Create_SqStack(capacity)

typedef struct SqStack
{
    ElemType data[MAXSIZE];//unsigned int *data
    int top;
}SqStack;


SqStack* Create_Stack()
{
    SqStack *stack = malloc(sizeof(SqStack)); 
    if(stack == NULL)
    {
        return NULL;
    }

    stack->top = -1;//注意空栈是-1

    return stack;
}

int Push_Stack(SqStack *stack,ElemType data)
{
    if(stack == NULL)
    {
        return -1;
    }

    if(stack->top >= MAXSIZE - 1)//在这是大于等于19
    {
        return -2;//栈满
    }

    stack->top++;
    stack->data[stack->top] = data;

    return 0;
}

int Pop_Stack(SqStack *stack,ElemType *value)
{
    if(stack == NULL || value == NULL)
    {
        return -1;
    }

    if(stack->top == -1)
    {
        //没有,无法弹出
        return -2;
    }

    *value = stack->data[stack->top];
    stack->top--;

    return 0;
}

int Top_Stack(SqStack *stack,ElemType *value)
{
    if(stack == NULL || value == NULL)
    {
        return -1;
    }

    if(stack->top == -1)
    {
        return -2;
    }

    *value = stack->data[stack->top];
    return 0;
}



void Destory_Stack(SqStack *stack)
{
    if(stack == NULL)
    {
        return;
    }

    free(stack);
}


int main()
{
    int i = 0,value = 0;
    SqStack *stack = Create_Stack();

    for(i=0;i<=20;i++)  //故意多一个
    {
        if(Push_Stack(stack,i) != 0)
        {
            printf("push %d error\n",i);
        }
        else
        {
            Top_Stack(stack,&value);
            printf("top:%d  ",value);
        }
    }


    Pop_Stack(stack,&value);
    printf("\ndelete num:%d\n",value);

    Destory_Stack(stack);

    return 0;
}

结果:
top:0 top:1 top:2 top:3 top:4 top:5 top:6 top:7 top:8 top:9 top:10 to
p:11 top:12 top:13 top:14 top:15 top:16 top:17 top:18 top:19 push 20 er
ror

delete num:19

上面的测试代码中,循环插入0到20,如果不成功,就打印push error,如果成功,就打印top:data。可以看到,0~19都成功了,第20个数就无法再插进来了。可以说,整体的结果都在意料之中。整体的代码也不是很难,可以说,就是前面的线性表的简易版。大家可以将这段代码作为学习的参考代码,因为是完整的代码,比起某些书上的伪代码,会让大家有更好地理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值