顺序栈的实现

typedef struct Stack
{
    ELEM_TYPE* base;
    int top;
    int stacksize;
}Stack, * PStack;


void Init_Stack(PStack ps);

bool Push(PStack ps, ELEM_TYPE val);

bool Pop(PStack ps, ELEM_TYPE* rtval);

bool Top(PStack ps, ELEM_TYPE* rtval);

int Get_Length(PStack ps);

bool IsEmpty(PStack ps);

bool IsFull(PStack ps);

void Inc(PStack ps);

void Clear(PStack ps);

void Destory(PStack ps);

void SHOW(PStack ps);`
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
#include "stack.h"

void Init_Stack(PStack ps)
{
    ps->base = (ELEM_TYPE*)malloc(INIT_SIZE * sizeof(ELEM_TYPE));
    assert(ps->base != nullptr);

    ps->top = 0;
    ps->stacksize = INIT_SIZE;
}


bool Push(PStack ps, ELEM_TYPE val)
{
    assert(ps != nullptr);
    if (ps == NULL)
    {
        return false;
    }

    if (IsFull(ps))
    {
        Inc(ps);
    }

    ps->base[ps->top++] = val;

    return true;
}


bool Pop(PStack ps, ELEM_TYPE* rtval)

{

    if (IsEmpty(ps))
    {
        return false;
    }

    *rtval = ps->base[--ps->top];
    return true;
}



bool Top(PStack ps, ELEM_TYPE* rtval)
{

    if (IsEmpty(ps))
    {
        return false;
    }
    *rtval = ps->base[ps->top - 1];
    return true;
}


int Get_Length(PStack ps)
{
    return ps->top;
}


bool IsEmpty(PStack ps)
{
    return ps->top == 0;
}


bool IsFull(PStack ps)
{
    assert(ps != nullptr);
    return ps->top = ps->stacksize;
}



void Inc(PStack ps)//malloc realloc calloc
{
    ps->base = (ELEM_TYPE*)realloc(ps->base, sizeof(ELEM_TYPE) * ps->stacksize * 2);
    assert(ps->base != nullptr);
    ps->stacksize *= 2;
}


void Clear(PStack ps)
{
    ps->top == 0;

}


void Destory(PStack ps)
{

    free(ps->base);
    ps->base = NULL;
    ps->top = ps->stacksize = 0;

}


void SHOW(PStack ps)
{
    for (int i = 0; i < ps->top; ++i)
    {
        printf("%d ", ps->base);
    }
    printf("\n");
}
//顺序栈 测试用例
int main()
{
    Stack st;
    Init_Stack(&st);

    for (int i = 0; i < 20; ++i)
    {
        Push(&st, i + 1);
    }
    SHOW(&st);
    printf("length = %d\n", Get_Length(&st));
    ELEM_TYPE rtval;
    bool tag = Top(&st, &rtval);
    if (tag)
    {
        printf("top->%d\n", rtval);
    }
    ELEM_TYPE tmp;
    bool tag2 = Pop(&st, &tmp);
    if (tag2)
    {
        printf("pop->%d\n", tmp);
    }
    SHOW(&st);
    printf("length = %d\n", Get_Length(&st));
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值