【小白】栈的顺序存储结构的实现(C语言版)

系列文章目录

第一章 线性表的顺序存储结构的实现(C语言版)
第二章 线性表的链式存储结构的实现(C语言版)



前言

分享一下自己学习数据结构时的代码


一、栈是什么?

1:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾(栈顶)进行插入和删除操作的线性表。
一个具有注脚的文本。1
2:栈采用先进后出的原则
在这里插入图片描述

二、栈的顺序存储结构的实现

1.实现所需要的函数

Status IniStack(stack *s);
Status StatckEmpty(stack s);
Status StackLength(stack s);
Status ClearStack(stack s);
Status DestroyStack(stack s);
Status Push(stack *s,int data);
Status Pop(stack *s,int *e);

2.定义常量

#define OK 0;
#define ERROR 1;
#define OVERFLOW -1;
#define TRUE 1;
#define FALSE 0;
#define MAX 10
typedef int Status;

3.定义结构体

typedef struct stack{
    int data;
    //定义栈底
    struct stack *base;
    ///定义栈顶
    struct stack *top;
    //定义栈的长度
    int stackSize;
}stack;

4.实现()

4.1 顺序栈的初始化

Status IniStack(stack *s){
	//为栈分配内存空间,栈底指向第一个栈的元素
    (*s).base = (stack *)malloc(sizeof(stack) * MAX);
    //分配内存失败
    if(!(*s).base)
        return ERROR;
     //栈顶和栈底指向同一个位置
    (*s).top = (*s).base;
    //栈的长度可以随便定
    (*s).stackSize = 10;
    return OK;
}

4.2判断栈是否为空

Status StatckEmpty(stack s){
	//栈顶和栈底指向同一位置
    if(s.base == s.top)
        return TRUE; 
    return FALSE;
}

4.3获取顺序栈的长度

Status StackLength(stack s){
    return s.top-s.base;
}

4.4顺序栈的置空

Status ClearStack(stack s){
	//直接让栈顶指向栈底即可
	//这里不需要修改栈顶和栈底之间的元素,当入栈时,原来栈中存储的元素存储的内容自动更换
    s.top = s.base;
}

4.5顺序栈的销毁

Status DestroyStack(stack s){
	//释放栈底指向的空间
    free(s.base);
    s.base = s.top = NULL;
    s.stackSize = 0;
}

4.6顺序栈的入/压栈

Status Push(stack *s,int data){
	//判断栈是否已满
    if((*s).top - (*s).base > MAX)
        return OVERFLOW;
     //将栈顶元素赋值
    ((*s).top)->data = data;
    //栈顶向上移
    (*s).top++;
    printf("%p\n",(*s).top);
    return OK;
}

4.7顺序栈的出/弹栈

Status Pop(stack *s,int *e){
	//判断栈是否为空
    if((*s).top == (*s).base)
        return ERROR;
     //栈顶向下移
    (*s).top--;
    *e = ((*s).top)->data;
    printf("%p\n",(*s).top);
    return OK;
}

总结

栈:元素采取先进后出的原则

顺序栈的优点:查询速度快
顺序栈的缺点:使用一块连续的内存空间


  1. 摘自:科普中国 ↩︎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值