数据结构——堆栈

目录

堆栈—概述

对线性堆栈进行操作

入栈:

出栈:

双向堆栈

 对双向堆栈进行操作

入栈

出栈


堆栈—概述

堆栈是一种线性存储形式,通常由一个一维数组构成。栈的顺序存储通常由一个一维数组和一个记录栈顶的位置变量组成。在这里一维数组代表栈内元素,top代表栈顶元素位置。

注意:top=-1的时候代表空栈,top=0代表栈内有一个元素。

在这里,我爱将两种堆栈:一种是线性堆栈,一种是双向堆栈。

(我们可以把堆栈形象的比喻为一个羽毛球筒,羽毛球只能一个一个装进去,再一个一个按顺序拿出来。)

对线性堆栈进行操作

入栈:

检验知否堆栈满,如果没满就把元素堆入栈,top值+1。

void Push(Stack PtrS,ElementType item)
{
    if(PtrS->Top==MaxSize-1)
    {
        printf("栈堆满");
        return;
    }
    else
    {
        PtrS->Data[++(PtrS->Top)]=item;
        return;
    }
    
}

出栈:

检验是否堆栈空,如果没空,就将元素出栈,top值-1。

ElementType Pop(Strack PtrS)
{
    if(PtrS->Top==-1)
    {
        printf("堆栈空");
        return ERROR;
    }
    else
    {
        return(PtrS->Data[++(PtrS->Top)--]);
    }
}

双向堆栈

因为我们利用一维数组存储堆栈,而一维数组有一个小弊端:必须在定义的时候就知道元素数量。所以有时候可能会存在浪费空间的问题。

现在我们采取一个新的存储方式:双向存储。即数组的两端都是Top,从两侧向中间填充。这样就能很大程度地避免浪费空间的问题。(如下图)

 对双向堆栈进行操作

入栈

先判断堆栈满了没。如果没满,要往第一个堆栈里添加元素,就top1++。要往第二个堆栈添加元素就top2--。

void Push(struct DStack *PtrS,ElementType item,int Tag)
{
    if(PtrS->Top2-PtrS->Top1==1)
    {
        printf("栈堆满");
        return;
    }
    if(Top==1)
    {
        PtrS->Data[++(PtrS->Top1)]=item;
    else
        PtrS->Data[--(PtrS->Top1)]=item;
}

出栈

先判断是否空栈。再分别进行操作。

ElementType Pop(struct DStack *PtrS,int Top)
{
    if(Tag==1)
    {
        if(PtrS->Top1==-1)
        {
            printf("堆栈1空");
            return NULL;
        }   
        else return PtrS->Data[--(PtrS->Top1)];
    }
    else
    {
        if(PtrS->Top2==MaxSize)
        {
            printf("堆栈2空");
            return NULL;
        }
        else return PtrS->Data[--(PtrS->Top1)];
    }
}

有问题欢迎补充/指正

就酱,拜拜~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若东

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值