栈基础知识的温习

定义简介:

就是特殊的线性表,具有先进后出的特性(就是可以想象成一个空瓶子,在不出意外的情况下先进入瓶子的物体被埋在底下,随着瓶内物品越来越多,先进入的东西自然后出瓶子,要等瓶口的先出才能出),特殊点就是这个线性表只在表尾进行数据的删除与添加,由于他这个特性所以我们给它取名为“栈”,原本的表尾称为“栈顶”,原本的表头称为“栈顶”

初始化操作:

和线性表差不多,也分为初始化为顺序式还是链式,顺序式中用一段连续的存储单元来存储数据元素,其中用top来指示项顶元素的数据位置,当top==0时即该顺序栈为空栈,由于一开始无法确定容量,就先定个基础容量,等到不够再加。展示一下顺序栈的定义:stack(栈) sqstack=sequence stack(顺序栈)   

typedef struct{    //用个结构体存放结构体变量
    SDataType *base; //栈底指针
    SDataType *top;  //栈顶指针
    int StackSize;   //当前已经分配的存储空间,以元素为单位 
}SqStack;

第一次数据分配可以用malloc函数来动态分配,判断是否为空栈,可以s.top==s.base,判断是否为满栈,我们可以先定义一个StackSize来表示已分配的储存空间,然后用s.top-s.base=StackSize来判断是否为满栈。

入栈:先要检查是否满栈,如果满栈了还要追加空间,用到realloc函数来添加,用push函数来加如入。具体用一行代码来展示一下:

Status Push(SqStack &s,SDataType e){
    SDataType *p;
    //首先判断栈是不是满的(上溢) 
    if(s.top-s.base == s.StackSize){
        //追加空间 
        p = (SDataType *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SDataType));
        if(!p){
            //如果没有找到符合条件的存储空间,则返回error 
            return OVERFLOW;
        }
        //成功找到则使s.base指向p 
        s.base = p;  //系统会将原来的内容复制过来
        s.top = s.base + s.StackSize;
        s.StackSize +=  STACKINCREMENT;
    }
    //先插入元素,然后使栈顶指针加 1 
    *(s.top) = e;
    s.top++;
    return OK;

//出栈
Status Pop(SqStack &s,SDataType &e){
    //判断是否会发生下溢 
    if(s.top != s.base){
        s.top--;    //先将栈顶指针减 1 
        e = *(s.top);
    }else{
        return 0;
    }
    return e;
}
 

p = (SDataType *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(SDataType));

出栈:同样先判断是否为空栈,如果栈空了则返回error。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值