数据结构(C语言版 严蔚敏著)——栈和队列

栈的定义

· 书本定义:栈是一个后进先出的线性表,它只要求只在表尾 进行删除和插入操作。

· 通俗定义:栈就是一个特殊的线性表(顺序表,链表),操作上有一些特殊性:

    -栈的元素必须“后进先出”。

    -栈的操作只能在这个线性表的表尾进行。

    -注:线性表的表尾对栈来说,是它的栈顶,响应的表头称为栈底。

栈的顺序存储结构:

· 因为栈的本质是一个线性表,线性表有两种存储形式,那么栈也有分为栈的

  顺序存储结构和栈的链式存储结构。

· 最快开始没有数据称为空栈,此时栈顶就是栈底。然后数据从栈顶进入,栈顶栈底分

  离,整个栈的当前容量变大。数据出栈时从栈顶弹出,栈顶下移,栈的当前容量变小。

注意:top指针始终指向栈顶元素的上方,也可根据自己的想法指在栈顶元素。

结构代码:

#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10   //存储空间分配增量
typedef int SElemType;
typedef struct {
    SElemType *base;    //在栈构造之前和销毁之后,base值为NULL
    SElemType *top;     //栈顶指针
    int stacksize;      //当前已分配的存储空间,以元素为单位
} SqStack;

 

· 这里定义了一个顺序存储的栈,它包含了三个元素:base,top,stacksize。

 

  其中base是指向栈底的指针变量,top是指向栈顶的指针变量,stacksize

  指示栈的当前可使用的最大容量。

创建一个栈://InitStack

int InitStack(SqStack &S) {
    //构造一个空栈S
    S.base = (SElemType *) malloc(STACK_INIT_SIZE * sizeof(SElemType));
    //存储分配失败
    if (!S.base)
        exit(0);
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return 1;
}

 

栈的插入和删除操作

· 栈的插入操作(push),叫做进栈,也称为压栈,入栈。

· 栈的删除操作(pop),叫做出栈,也称为弹栈。

入栈操作

· 入栈操作又叫压栈操作,就是向栈中存放数据。

· 入栈操作要在栈顶进行,每次向栈中压入一个数据,top指针就要+1,直到栈满。

入栈算法://Push

int Push(SqStack &S, SElemType e) {
    //插入元素e为新的栈顶元素
    if (S.top - S.base >= S.stacksize) {
        //栈满,追加存储空间
        S.base = (SElemType *) realloc(S.base, 
                                       (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        //出错退出
        if (!S.base)
            exit(0);
        //使top指针重新回到栈顶
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top++ = e;//赋值后,指针上移
    return 1;
}

出栈操作

· 出栈操作就是在栈顶取出数据,栈顶指针随之下移的操作。

· 每当从栈内弹出一个数据,栈的当前容量就-1。

出栈算法://Pop

int Pop(SqStack &S,SElemType &e){
    //若栈不为空,则删除S的栈顶元素,用e返回其值
    //并返回1,否则返回0
    if(S.top==S.base)
        return 0;
    //top指针下移,并赋值给e
    e=*--S.top;
    return 1;
}

清空一个栈

· 所谓清空一个栈,就是将栈中的元素全部作废,但栈本身物理空间并不发生改变。

· 只需将s.top的内容赋值为s.base,这样s.base等于s.top,这就表明栈空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值