/*
* @Author:
* @Date: 2022-03-10 10:09:53
* @LastEditTime: 2022-03-10 14:49:53
* @LastEditors: Please set LastEditors
* @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
* @FilePath: \sqstack\sqstack.c
*/
#include "sqstack.h"
/**
* @description: 顺序栈的创建
* @param {int} len -用户规定的栈长
* @return {sqstack-栈顶指针}
*/
sqstack* stack_create(int len) {
sqstack * s;
if ((s =(sqstack *)malloc(sizeof(sqstack))) == NULL)
{
printf("malloc sqstack failed\n");
return NULL;
}
if ((s->data = (data_t *)malloc(len * sizeof(data_t)))==NULL)
{
printf("malloc data failed\n");
free(s);
return NULL;
}
memset(s->data, 0, len*sizeof(data_t));
s->maxlen = len;
s->top = -1;
return s;
}
/**
* @description: 进栈
* @param {sqstack* } s-栈顶指针
* @param {data_t} value-进栈的值
* @return {-1-函数失败,0-函数成功}
*/
int stack_push(sqstack *s, data_t value)
{
if (s == NULL) {
printf("s is NULL\n");
return -1;
}
if (s->top == s->maxlen-1)
{
printf("stack is full\n");
return -1;
}
s->top++;
s->data[s->top] = value;
return 0;
}
/**
* @description: 判断栈是否为空
* @param {sqstack*} s-栈顶指针
* @return {-1-函数失败,1-栈为空,0-栈不为空}
*/
int stack_empty(sqstack *s)
{
if (s == NULL) {
printf("s is NULL\n");
return -1;
}
return (s->top == -1 ? 1 : 0);
}
/**
* @description: 判断栈是否满
* @param {sqstack*} s-栈顶指针
* @return {-1-函数失败,1-栈满,0-栈没满}
*/
int stack_full(sqstack *s)
{
if (s == NULL) {
printf("s is NULL\n");
return -1;
}
return (s->top == s->maxlen-1 ? 1 : 0);
}
/**
* @description: 出栈
* @param {sqstack*} s-栈顶指针
* @return {栈顶的值}
*/
data_t stack_pop(sqstack *s) {
s->top--;
return (s->data[s->top+1]);
}
/**
* @description: 得到栈顶的值
* @param {sqstack*} s-栈顶指针
* @return {栈的值}
*/
data_t stack_top(sqstack *s) {
return (s->data[s->top]);
}
/**
* @description: 栈清空
* @param {sqstack*} s-栈顶指针
* @return {-1-函数失败,0-函数成功}
*/
int stack_clear(sqstack *s) {
if (s == NULL) {
printf("s is NULL\n");
return -1;
}
s->top = -1;
return 0;
}
/**
* @description: 顺序栈删除
* @param {sqstack*} s-栈顶指针
* @return {-1-函数失败,0-函数成功}
*/
int stack_free(sqstack *s) {
if (s == NULL) {
printf("s is NULL\n");
return -1;
}
if (s->data != NULL)
free(s->data);
free(s);
return 0;
}
【数据结构与算法】栈的实现C程序
需积分: 0 44 浏览量
更新于2022-03-10
收藏 12KB ZIP 举报
在IT领域,数据结构与算法是编程的基础,它们直接影响到程序的效率和可维护性。栈(Stack)作为一种基础的数据结构,被广泛应用于各种场景,如括号匹配、深度优先搜索(DFS)等。本资源提供了C语言实现的栈,包括顺序栈和链表栈,这将有助于理解栈的工作原理及其在实际中的应用。
1. **栈的基本概念**
栈是一种后进先出(LIFO, Last In First Out)的数据结构,类似于我们日常生活中使用的叠盘子。元素的添加(压入)和删除(弹出)都只能在栈顶进行。栈的主要操作有:初始化、压栈、弹栈、查看栈顶元素以及检查栈是否为空。
2. **顺序栈的实现**
顺序栈通常使用数组来实现,它的优点是访问速度快,但缺点是容量固定,如果超过预设容量需要扩容,可能导致空间浪费。C语言实现顺序栈时,可以通过定义一个结构体,包含数组和栈顶指针。在压栈时,如果未达到数组的最大容量,则将元素添加到栈顶;弹栈时,返回并移除栈顶元素。
3. **链表栈的实现**
链表栈使用链表结构,每个节点包含元素值和指向下一个节点的指针,这样可以灵活地动态增加或减少存储空间,避免了顺序栈的容量限制。链表栈的头部作为栈顶,插入和删除操作都只需改变头部节点即可。C语言实现链表栈时,需要定义节点结构体,并实现插入(压栈)、删除(弹栈)、获取栈顶元素等操作。
4. **头文件(.h)的声明**
在C语言中,头文件用于存放函数原型、常量定义和结构体声明等,便于代码的模块化。在本例中,`stack.h`可能包含了栈的结构体定义(如顺序栈和链表栈的节点结构)、栈操作函数的原型声明,例如`push()`, `pop()`, `isEmpty()`等。
5. **测试文件(test.c)**
`test.c`通常用于验证栈的正确性,通过编写一系列测试用例,调用栈的接口进行压栈、弹栈等操作,然后检查结果是否符合预期。这有助于确保代码的功能正确性和健壮性。
6. **学习和实践**
对于初学者,通过阅读和理解这些源码,可以深入理解栈的内部工作机制,提升C语言编程技巧,同时对数据结构和算法有更直观的认识。此外,可以尝试扩展功能,如实现动态扩容的顺序栈,或者优化链表栈的性能。
这个资源为学习和研究栈的数据结构提供了很好的实例,不仅可以帮助巩固C语言基础,还能增强对数据结构和算法的理解,对于IT从业者来说是非常有价值的参考资料。

修成真
- 粉丝: 3w+
最新资源
- 企业-集团内网网站建设解决方案(1).doc
- 互联网+模式下的小商品营销模式研究.docx
- Access数据库基础及应用教材配套资源ppt课件(完整版).zip
- 11可编程控制器的系统设计演示教学.ppt
- 东北大学2021年9月《计算机基础》作业考核试题及答案参考8.docx
- 应用TPI系统建设石油学科特色数据库初探-高校图书馆.docx
- 互联网+智慧医院的发展探索.docx
- 人工智能时代新闻记者的能力挑战与价值重塑.docx
- 吉林大学2021年9月《可编程控制器》作业考核试题及答案参考10.docx
- 基于大数据的智慧公交系统顶层架构设计.docx
- 2023年我的考研心得北京邮电大学计算机专业.doc
- 会计信息化对企业财务管理的影响及对策-1(1).docx
- 电子商务案例分析课程标准.doc
- 浅议会计信息化工作的特点.docx
- 互联网时代背景下图书馆阅览室建设研究.docx
- 基于单片机的音乐播放器设计.docx