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

数据结构-栈

栈:Linux内存中的栈空间就是基于此设计的,栈遵循“后进先出”的原则。也被成为“LIFO”结构,意思是“last input first output”。进栈(PUSH)、出栈(POP)。
1.顺序栈
顺序栈:一般是把数组头作为栈底,数组头部到数组尾部作为栈的增长方向bottom为首元素地址,top为最后元素下标。

  • 结构体
typedef struct {DataType_t *bottom;  //栈底,数组的指针unsigned int size;int top;  //当前已使用的元素个数(索引)
} Sqstack_t;
  • 创建一个顺序栈
Sqstack_t* SqStack_create(unsigned int size)
{Sqstack_t *manage=(Sqstack_t *)calloc(1,sizeof(Sqstack_t));if(!manage){perror("calloc manage failed");return NULL;}manage->bottom=(DataType_t *)calloc(size,sizeof(DataType_t));if(!manage->bottom){     //给数组分配空间perror("calloc bottom failed");free(manage);return NULL;}manage->size=size;   //容量manage->top=-1;      //-1表示栈空return manage;       
}
  • 入栈
bool SqStack_Push(Sqstack_t *list,DataType_t value)
{if(list->top+1>=list->size){printf("stack is full\n");return false;}list->bottom[++list->top]=value;  //入栈return true;
}
  • 出栈
DataType_t SqStack_Pop(Sqstack_t *list)
{if(list->top==-1){printf("stack is empty\n");return -1;}return list->bottom[list->top--];  //出栈
}
  • 遍历顺序栈
void SqStack_Print(Sqstack_t *list)
{if(list->top == -1){printf("list is empty\n");return;}for(int i=0;i<=list->top;i++){  //遍历栈printf("%d ",list->bottom[i]);}
}

2.链式栈
链式栈:一般是把链表头部作为栈顶,方便数据的插入和删除(头插+头删),top为头结点,top->next为首结点,top->next为空时,栈空。

  • 结构体
typedef int DataType_t;
typedef struct Node{DataType_t data;struct Node* next;
}Node_t;
  • 创建一个链式栈
Node_t* CreateLinkStack()
{Node_t* top = (Node_t*)malloc(sizeof(Node_t));if(top == NULL){printf("内存分配失败\n");exit(-1);}top->next = NULL;return top;
}  
  • 新建一个节点
Node_t* CreateNode(DataType_t value)
{Node_t* newNode = (Node_t*)malloc(sizeof(Node_t));if(newNode == NULL){printf("内存分配失败\n");exit(-1);}newNode->data = value;newNode->next = NULL;return newNode;
}
  • 入栈
bool LinkStack_Push(Node_t* top, DataType_t value)
{Node_t* newNode = CreateNode(value);if(newNode == NULL){return false;}newNode->next = top->next;top->next = newNode;return true;
}
  • 出栈
DataType_t LinkStack_Pop(Node_t* top)
{if(top->next == NULL){   // 链式栈为空printf("链式栈为空,无法删除节点\n");return; }Node_t* temp = top->next;DataType_t poppedValue = temp->data;top->next = temp->next;free(temp);return poppedValue;
}
  • 遍历顺序栈
bool Print_LinkStack(Node_t* top)
{if(top->next == NULL){   // 链式栈为空printf("链式栈为空\n");return false;}Node_t* current = top->next;while(current){printf("%d -> ", current->data); current = current->next;        }printf("NULL\n");return true;
}
http://www.jsqmd.com/news/201499/

相关文章:

  • ED2K协议入门:从零开始理解电驴网络
  • 从身份到集群:多智能体协作的认知架构
  • ABC 433 EFG
  • 设计模式学习(8) 23-6 适配器模式
  • VIDRESZR.DLL文件损坏丢失找不到 打不开问题 下载方法免费分享
  • 如何用AI快速解决Spring启动异常:Context初始化失败问题
  • 深度学习毕设选题推荐:基于python_CNN卷积神经网络识别花卉是否绽放人工智能
  • 智能硬件设计革命:基于FSM的Verilog代码自动生成器
  • 零基础搭建AI电子教室:3天实现智能教学
  • vm3dum_loader.dll文件问题 免费下载方法分享
  • COMFYUI零基础入门:30分钟搭建第一个工作流
  • 全球因瓦合金箔材市场分析与行业调研
  • ue 语音合成 算法笔记
  • vpnikeapi.dll文件损坏丢失找不到 免费下载方法分享
  • 深度学习毕设选题推荐:基于人工智能python深度学习的乐器识别
  • 用 VXE-TABLE 快速验证你的数据展示创意
  • 全球超透镜市场规模分析及发展趋势
  • AI一键搞定Node.js环境配置,告别繁琐安装步骤
  • 线程安全不可变类:某电商平台的购物车服务在促销期间频繁出现商品数量不一致的问题。分析发现,多个线程同时修改购物车对象导致数据混乱。当团队将购物车核心对象重构为不可变类后,问题迎刃而解,系统性能反而提升
  • 深度学习毕设选题推荐:基于python的识别水面漂浮垃圾
  • ai公文写作高效技巧-利用材料星大模型直接进行仿写
  • 论文降aigc避坑指南:乱用降ai率工具反而导致查重率升高?
  • AI一键搞定IDEA+Maven配置,告别繁琐手动操作
  • 计算机深度学习毕设实战-深度学习基于python深度学习识别水面漂浮垃圾
  • 栈封闭的核心原理:为什么局部变量是线程安全的?某金融交易系统的日期格式化操作在高并发下成为性能瓶颈。原本使用全局共享的SimpleDateFormat对象,即使加锁后QPS(每秒查询率)也只有2000
  • 如何用AI解决Git合并冲突:拒绝合并无关历史
  • 深度学习毕设项目:机器学习基于深度学习-pytorch对水果(柠檬)品种识别
  • 电商网站页面升级实战:如何保证访问不中断?
  • 第 173 场双周赛Q3——3796. 找到带限制序列的最大值
  • 增强提示词套件核心板