当前位置: 首页 > backend >正文

数据结构——栈

目录

概念与结构

栈底层结构选型

数组

链表

使用数组实现栈

​编辑

初始化栈

判断栈空

入栈

出栈

取栈顶元素

栈的元素个数

销毁


概念与结构

栈是一种特殊的线性表,它只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据遵循先进后出的原则

压栈:栈的插入操作叫做压栈/入栈/进栈。

出栈:栈的删除操作叫做出栈。

出数据和入数据都在栈顶。

栈底层结构选型

数组

链表

 那么对于数组和链表我们选择哪个比较好呢?

答案是数组。因为链表虽然动态性更强,但是每个操作都需要动态分配结点,内存开销比较大,且频繁分配/释放可能引发内存碎片。而数组尾插尾删的效率更高。

使用数组实现栈

我们就根据顺序表的结构来模拟一遍栈的结构。

typedef int STDataType;
typedef struct stack
{STDataType* arr;int top;int capacity;
}ST;

初始化栈

void STInit(ST* ps)
{assert(ps);ps->arr = NULL;ps->top = ps->capacity = 0;
}

判断栈空

bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}

入栈

void STCheck(ST* ps)
{if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* tmp = (STDataType*)realloc(ps->arr, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("realloc failed!");exit(1);}else{ps->arr = tmp;ps->capacity = newcapacity;}}
}
void STPush(ST* ps, STDataType x)
{assert(ps);STCheck(ps);ps->arr[ps->top++] = x;
}

出栈

void STPop(ST* ps)
{assert(ps && ps->arr && !STEmpty(ps));ps->top--;
}

注意:删除的空间不能free掉,因为动态开辟的空间不能局部释放。

取栈顶元素

STDataType STTop(ST* ps)
{assert(ps && ps->arr && !STEmpty(ps));return ps->arr[ps->top-1];
}

栈的元素个数

int STSize(ST* ps)
{assert(ps);return ps->top;
}

销毁

void STDestroy(ST* ps)
{assert(ps);free(ps->arr);ps->arr = NULL;ps->top = ps->capacity = 0;
}

http://www.xdnf.cn/news/782.html

相关文章:

  • 20. git diff
  • PTA | 堆中的路径
  • 硬件工程师笔记——电子器件汇总大全
  • 计算机视觉与深度学习 | LSTM原理,公式,代码,应用
  • 选择一个靠谱的小程序开发服务商要考虑哪些方面
  • 数字孪生废气处理工艺流程
  • NFS服务共享和安装命令的补充
  • 从外网访问局域网服务器的方法
  • VMware虚拟机走主机代理上网
  • MindSpore GPU 版本安装教程
  • SQL注入 01
  • aws(学习笔记第三十九课) iot-core
  • JavaScript 性能优化
  • 【Java面试系列】Spring Cloud微服务架构中的分布式事务解决方案与Seata实现原理详解 - 3-5年Java开发必备知识
  • 小刚说C语言刷题——1049 汉译英
  • leetcode 1143. Longest Common Subsequence
  • 利用OLED打印调试信息: 控制PC13指示灯点灯的实验
  • Kubernetes相关的名词解释Dashboard界面(6)
  • CentOS stream 中部署Zabbix RPM软件包公钥验证错误
  • Java中订阅消费模式(发布-订阅模式)和观察者模式的区别
  • 进程管理,关闭进程
  • Linux进程管理:进程查看与控制核心指南
  • 硬件电路(25)-过温保护器件ksd9700温控开关
  • 命令行参数·环境变量·进程地址空间(linux+C/C++)
  • 位运算,状态压缩dp(算法竞赛进阶指南学习笔记)
  • Web前端:常用的布局属性
  • 聊一聊接口测试后垃圾数据如何清理?
  • 【Sa-Token】学习笔记05 - 踢人下线源码解析
  • Few-shot medical image segmentation with high-fidelity prototypes 论文总结
  • 计算机网络综合实验指南