顺序栈的实现以及初应用

首先,我们要搞明白什么是栈?

栈是一种受限线性表,也就是说,栈元素具有线性关系,即前驱后继关系;
只不过它是 一种特殊的线性表而已

那么顺序栈呢?

栈的顺序存储结构简称顺序栈,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,
同时附设指针top指示栈顶元素在顺序表中的位置。

下面是栈的的实现:

首先先引用一些头文件,后面会用到:

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

这里我们采用用数组对栈的实现(数组相对于链表缓存更加快速!)

typedef char StDateType;
typedef struct Stack
{
    StDateType* arr;  //栈的主体
    int top;    //栈顶
    int capacity;//栈的容量
}Stack;

现在栈有了,那么怎么实现初始化和栈销毁呢?

//栈的初始化
void StackInit(Stack* B)
{
    assert(B);
    B->arr = NULL;
    B->top = 0;
    B->capacity = 0;
}
//栈的销毁
void StackDestory(Stack* B)
{
    assert(B);
    free(B->arr);
    B->arr = NULL;
    B->top = B->capacity = 0;
}

好,有了最简单的初始化和销毁,我们接下来的任务就是往栈里放数据了。

void StackPush(Stack* B, StDateType c)
{
    assert(B);
    if (B->top == B->capacity)            //判断是否要增容
    {
        int newcapacity = B->capacity == 0 ? 4 : B->capacity * 2;
        B->arr = (StDateType*)realloc(B->arr, newcapacity * sizeof(StDateType));
        if (B->arr == NULL)
        {
            exit(-1);
        }
        B->capacity = newcapacity;
    }
    B->arr[B->top] = c;                //存放数据
    B->top++;                         //栈顶位置更新
}

如果我想销毁栈顶数据呢?

很简单,只需要把栈顶的位置往前推一位

void StackPop(Stack* B)
{
    assert(B);
    assert(B->top>0);   //判断栈是否为空,为空肯定不能不能再删除了!
    --B->top;
}

其实这里也可以写一个判断是否为空的函数:

bool StackEmpty(Stack* B)
{
    return B->top == 0;
}

栈顶位置的数据拿取:

StDateType StackTop(Stack* B)
{
    assert(B);
    assert(B->top > 0);
    return B->arr[B->top - 1];
}

到此,栈的简单实现和应用就完成啦!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值