数据结构——栈
作者:小教学发布时间:2023-10-02分类:程序开发学习浏览:77
导读:栈是一种特殊的线性表,他只允许在固定的一端进行数据的插入删除,我们把固定的一端叫做栈顶,另一端叫做栈底,压栈:在栈顶插入数据,出栈:删除栈顶的数据,遵循后进先出的原则...
栈是一种特殊的线性表,他只允许在固定的一端进行数据的插入删除,我们把固定的一端叫做栈顶,另一端叫做栈底, 压栈:在栈顶插入数据,
出栈:删除栈顶的数据,遵循后进先出的原则
可以看出栈只是用来存储数据的线性表(容器),那么我们之前学习过的两种线性表:顺序表和链表就都可以来做栈
只不过栈只可以在栈顶插入删除数据
可以看出,用顺序表来做栈是相对较方便的
现在我们就用顺序表来实现栈
1、创建一个结构体,里面包括了开辟顺序表的指针,顺序表的有效原数记录变量,顺序表容量记录变量
然后初始化顺序表
2、压栈
void STPush(ST* ps,SltDatatype x)//入栈
{
assert(ps);
if (ps->top == ps->capacity)
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//因为初始化是capacity是0,所有这里需要,如果capacity是0的话,*2也是0,所有要在这里先给他一个值4
//扩容
SltDatatype * tmp= (SltDatatype*)realloc(ps->a, sizeof(SltDatatype) * newcapacity);
if (tmp == NULL)
{
perror("realloc fail");
exit(-1);
}
ps -> a = tmp;
ps->capacity = newcapacity;
}
ps->a[ps->top] = x;
ps->top++;
}
3、出栈(尾删)
void STPop(ST* ps)//出栈
{
assert(ps);
assert(ps->top>0);//空
ps->top--;
}
获取栈顶元素
SltDatatype STTop(ST* ps)//获取栈顶原数
{
assert(ps);
assert(ps->top > 0);
return ps->a[ps->top - 1];
}
栈元素的访问,因为栈是后进先出,所以在访问(打印)栈元素的时候不能直接通过遍历数组来打印,应该是从栈顶拿一个元素打印一个元素
while (s.top > 0)
{
printf("%d",s.a[s.top - 1]);
STPop(ps);//出栈
}
栈的释放
void STDestroy(ST* ps)//释放
{
assert(ps);
free(ps->a);
ps->a = NULL;
ps->capacity = 0;
ps->top = 0;
}
- 上一篇:AWS-Lambda之导入自定义包-pip包
- 下一篇:搭建自己的搜索引擎之四
- 程序开发学习排行
-
- 1鸿蒙HarmonyOS:Web组件网页白屏检测
- 2HTTPS协议是安全传输,为啥还要再加密?
- 3HarmonyOS鸿蒙应用开发——数据持久化Preferences
- 4记解决MaterialButton背景颜色与设置值不同
- 5鸿蒙HarmonyOS实战-ArkUI组件(RelativeContainer)
- 6鸿蒙HarmonyOS实战-ArkUI组件(Stack)
- 7鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)
- 8[Android][NDK][Cmake]一文搞懂Android项目中的Cmake
- 9鸿蒙HarmonyOS实战-ArkUI组件(mediaquery)
- 最近发表
-
- WooCommerce最好的WordPress常用插件下载博客插件模块的相关产品
- 羊驼机器人最好的WordPress常用插件下载博客插件模块
- IP信息记录器最好的WordPress常用插件下载博客插件模块
- Linkly for WooCommerce最好的WordPress常用插件下载博客插件模块
- 元素聚合器Forms最好的WordPress常用插件下载博客插件模块
- Promaker Chat 最好的WordPress通用插件下载 博客插件模块
- 自动更新发布日期最好的WordPress常用插件下载博客插件模块
- WordPress官方最好的获取回复WordPress常用插件下载博客插件模块
- Img to rss最好的wordpress常用插件下载博客插件模块
- WPMozo为Elementor最好的WordPress常用插件下载博客插件模块添加精简版