概况

后进先出

图解

这里写图片描述
如果要将栈中的数据取出,那么就必须按照3,2,1的顺序取出。

代码解析

#define STACK_SIZE 100 //栈的初始空间大小
#define STACKPU 10 //一次扩充空间的大小
typedef struct{
    int *bottom;//指向栈底的指针
    int *top;//指向栈顶的指针
    int stackSize;//栈的内容大小
}sqStack;

//初始化栈
void initStack(sqStack *q){
    /*为栈申请空间,这里的bottom用来申请空间,它只指向一个内存单元
   一开始理解成了bottom的大小 ,只不过它是这一连串空间的头指针,就像数组*/
    q->bottom = (int*)malloc(STACK_SIZE * sizeof(int));
    //判断是否申请成功
    if( !q->bottom)
        return;
    //一开始栈为空,栈顶和栈底的位置一样
    //top是一个指向栈顶的指针
    q->top = q->bottom;
    //栈的容量
    q->stackSize = STACK_SIZE;
}
//压栈
void Push(sqStack *s, int data){
    //如果栈被压满了,那么就扩充空间
    if(s->top - s->bottom >= s->stackSize){
        //printf("%p \n",s->bottom);输出:003A1708
        //将以前的内容复制到扩充的空间中
        s->bottom = (int*)realloc(s->bottom, (s->stackSize + STACKPU) * sizeof(int));
        //printf("%p \n",s->bottom);输出:003A1740
        //将栈顶定位到一个新的位置,因为bottom已经发生了变换,虽然数据没有变,但是地址变化了
        s->top = s->bottom + s->stackSize;
        s->stackSize = s->stackSize + STACKPU;
    }
    //将数据存入top指向的内存空间,然后向上移动
    *(s->top++) = data;

}
//出栈
int Pop(sqStack *s){
    if(s->top - s->bottom < 0){
        return -1;
    }
    //printf("%p ",s->top);
    //先向下移动再取值,因为在每次压栈后都有向上移动
    return *--(s->top);
}
//销毁栈,将栈底指针依次向栈顶指针移动,每移动依次便释放空间
void DistroyStack(sqStack *s){

    while(s->bottom != s->top){
        free(s->bottom);
        s->bottom ++;
    }
    s->bottom = s->top = NULL;
    s->stackSize = 0;
}
//获取栈的内容大小
int StackSize(sqStack *s){
    return s->top - s->bottom;//两个地址相减除以sizeof
}
/*清空栈,将栈顶指针指向栈底,硬盘格式化原理也是如此,
格式化后数据并没有消失而只是改变了文件清单,通过特殊的
软件可以找回恢复
*/
void ClearStack(sqStack *s){
    s->top = s->bottom;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值