顺序栈的实现

基本概念

  • ——限定仅在表尾进行插入或删除操作的线性表。
  • 栈又称为后进先出的线性表(LIFO)。
  • 栈的顺序存储结构是利用一组地址连续的存储单元一次存放自栈底到栈顶的数据元素。
  • 非空栈的栈顶指针始终在栈顶元素的下一个位置上。

存储结构

#ifndef SQHEAD_H_INCLUDED
#define SQHEAD_H_INCLUDED

//顺序栈的存储结构和基本操作说明

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef int ELemType;

typedef struct {
    ELemType *top;      //栈顶指针
    ELemType *bottom;   //栈底指针
    int stacksize;      //当前已分配存储空间
} SqStack;

//构造一个空栈
void Init_Stack(SqStack &S);

//销毁一个栈
void Destory_Stack(SqStack &S);

//把栈置为空
void Clear_Stack(SqStack &S);

//判断栈是否为空
bool isEmpty(SqStack S);

//返回栈的长度
int Stack_Length(SqStack S);

//返回栈顶元素,但不出栈
void GetTop(SqStack S, ELemType &e);

//入栈
void Push(SqStack &S, ELemType e);

//出栈
void Pop(SqStack &S, ELemType &e);

//打印栈元素
void showup(SqStack S);

#endif // SQHEAD_H_INCLUDED

实现

  1. 构造栈
//构造一个空栈
void Init_Stack(SqStack &S)
{
    S.bottom = (ELemType *) malloc(STACK_INIT_SIZE * sizeof(ELemType));
    if(!S.bottom){
        printf("初始化分配空间失败\n");
        return;
    }
    S.top = S.bottom;
    S.stacksize = STACK_INIT_SIZE;
    return;
}
  1. 返回栈的长度
//返回栈的长度
int Stack_Length(SqStack S)
{
    if(isEmpty(S)){
        return 0;
    }else{
        int length = 0;
        ELemType *temp = S.top;
        while(temp != S.bottom){
            length ++;
            temp --;
        }
        return length;
    }
}
  1. 入栈
//入栈
void Push(SqStack &S, ELemType e)
{
    if(Stack_Length(S) == S.stacksize){
        //栈的存储空间已经用完,需要括栈
        ELemType *temp = (ELemType *)realloc(S.bottom, (S.stacksize + STACKINCREMENT) * sizeof(ELemType));
        if(!temp){
            printf("括栈失败\n");
            return;
        }
        S.bottom = temp;
        S.top = S.bottom + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top ++ = e;
    return;
}
  1. 出栈
//出栈
void Pop(SqStack &S, ELemType &e)
{
    if(isEmpty(S)){
        printf("栈为空,出栈失败\n");
        return;
    }
    e = *(-- S.top);
    return;
}

小结

因为注释也比较全,代码思路和顺序表差不多,没有再用文字说明。完整代码

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值