【数据结构学习】顺序栈 C语言

#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
#define STACK_INT_SIZE 10               //存储空间初始分配量
#define STACKINCREMENT 5                //存储空间分配增量


typedef int ElemType;
typedef struct
{
    ElemType *top;                      //栈顶指针
    ElemType *base;                     //栈底指针
    int stacksize;                      //当前分配的存储空间
}Sqstack;


/*栈的初始化*/


int InitStack(Sqstack *s)
{
    s->base = (ElemType*)malloc(STACK_INT_SIZE*sizeof(ElemType));
    if(!s->base)                        //申请空间失败
    {
        return ERROR;
    }
    s->top = s->base;                   //置为空栈
    s->stacksize = STACK_INT_SIZE;      //设置当前栈空间大小
}


/*
入栈
入栈之前先要判断栈是否已满,判断栈是否满的语句s->top-s->base>=s->stacksize
如果已满则需要重新申请增加空间,同时栈顶指针的位置也需要发生变化 s->top+1


*/
int Push(Sqstack *s,ElemType e) //插入的e是一个具体的值
{
    if(s->top - s->base >= s->stacksize)
    {
        s->base = (ElemType*)realloc(s->base,s->stacksize+STACKINCREMENT);
        //realloc函数的用法
        //指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)
        if(!s->base)return ERROR;               //申请空间失败
        s->top = s->base + s->stacksize;        //重新设置当前栈顶指针
        s->stacksize += STACKINCREMENT;         //分配空间大小的改变
        /*
        s->stacksize += STACKINCREMENT;
        s->top = s->base + s->stacksize;

        两条语句不能颠倒的原因:

        realloc

        进行再分配空间的时候,如果在原来的基础上还有需要空间大小,那么

        得到的是连续的内存空间,如果空间不够,那就需要重新开辟一块空间。地址发生变化。

        一开始进行初始化的时候,栈顶指针和栈底指针指向同一位置
        当空间满的时候,需要将栈顶指针移到最顶端,如果先执行

        s->stacksize += STACKINCREMENT;

        那么后面执行s->top = s->base + s->stacksize; 的时候
        栈顶指针就指向后来申请空间的顶端,指向发生错误。
        */
    }
    //e = *s->top;  等号两边赋值发生错误
    //*s->top = e;          (1)
    //s->top++;             (2)  插入数据后栈顶指针向上移
    *s->top++ = e;          //将(1)和(2)句合成一句,参照i++
    return OK;
}
/*
  出栈
  出栈首先要判断栈是否为空,判断栈是否为空的语句
  s->top == s->base;
  如果不为空,则出栈要需要将栈顶指针下移
*/


int Pop(Sqstack *s,ElemType *e)
//完成元素的出栈,只需要将地址传进去就可以
//不同于元素的入栈
{
    if(s->top == s->base)return ERROR;  //判断栈是否为空
    //s->top--;                         修改栈顶指针-1
    //*e = *s->top;                      e返回出栈元素的值
    *e = *--s->top;
    return OK;
}


int Gettop(Sqstack *s,ElemType *e)
{
    if(s->top == s->base)return ERROR;
    *e = *(s->top-1);   //只取栈顶元素值,不改变栈顶指针指向
    return OK;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值