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

c语言——栈和队列

1.栈


1.1栈的概念及结构

1.1.1概念


:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(LastInFirstOut)的则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。

1.1.2结构

数组栈


链式栈
如果用尾做栈顶,尾插尾删,要设计成双向链表,否则删除数据效率低
如果用头做栈顶,头插头删,就可以设计成单链表

两种都可以,非要选一种,数组栈结构稍微好一点。

1.2接口函数

//要改变结构体的内容 //传结构体的指针 void StackInit(ST* ps); void StackDestory(ST* ps); void StackPush(ST* ps,STDataType x); void StackPop(ST* ps); STDataType StackTop(ST* ps); //取栈顶的数据 int StackSize(ST* ps); //栈中元素个数 bool StackEmpty(ST* ps); //判断栈是否为空

1.3详细代码

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<stdbool.h> typedef int STDataType; typedef struct Stack { STDataType* a; int top;//栈顶 int capacity; }ST; void StackInit(ST* ps) { assert(ps); ps->a = NULL; ps->top = 0; //初始化时,top给的是0, // 意味着top指向栈顶数据的下一个 // ps->top=-1; //初始化时,top给的是 - 1, // 意味着top指向栈顶数据 ps->capacity = 0; } void StackDestory(ST* ps) { assert(ps); free(ps->a); ps->a = NULL; ps->top = 0; ps->capacity = 0; } void StackPush(ST* ps, STDataType x) { assert(ps); if (ps->top == ps->capacity) { int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2; STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity); if (tmp == NULL) { printf("realloc fail\n"); exit(-1); } ps->a = tmp; ps->capacity = newCapacity; } ps->a[ps->top] = x; ps->top++; } void StackPop(ST* ps) { assert(ps); assert(ps->top > 0); //栈不为空才能删 ps->top--; } STDataType StackTop(ST* ps) { assert(ps); assert(ps->top > 0); //栈不为空才能取栈顶元素 return ps->a[ps->top - 1]; } int StackSize(ST* ps) { assert(ps); return ps->top; } bool StackEmpty(ST* ps) { assert(ps); /* if (ps->top == 0) return true; else return false; */ return ps->top == 0; } void TestStack() { ST st; StackInit(&st); StackPush(&st, 1); StackPush(&st, 2); StackPush(&st, 3); StackPush(&st, 4); //遍历栈中的数据 while (!StackEmpty(&st)) { printf("%d ", StackTop(&st)); StackPop(&st); } StackDestory(&st); } int main() { TestStack(); return 0; }
http://www.cnnetsun.cn/news/114607.html

相关文章:

  • 【JavaWeb】MVC模式_理论简介
  • 【JavaWeb】日程管理01——登录页及数据校验功能
  • springboot中File默认路径
  • 【2025年AI 编程时代的热点】
  • 【C++ 笔记】从 C 到 C++:核心过渡 (中)
  • SQL约束解析
  • 地铁调研12-17
  • 现代软件测试工具全景对比与选型指南
  • 基于 Apache POI 的体检报告 Word 生成实战文档
  • org.jetbrains.annotations的@Nullable 学习
  • 计算机毕业设计springboot计算机硬件自配系统 基于Spring Boot的计算机硬件配置管理系统设计与实现 Spring Boot架构下的计算机硬件自选系统开发
  • 【信创】中间件对比
  • 傅里叶变换小波变换
  • 智能桑拿房首选:水管家集成系统如何提升体验?
  • 最简单的LangChain和RAG
  • 空压机监控运维管理系统方案
  • 实习面试题-Rust 面试题
  • 视频字幕精确生成方法 用到字幕api开发文档
  • React Fiber 架构解析:如何利用 `requestIdleCallback` 实现时间切片(Time Slicing)
  • SPA 应用中的路由切换内存泄漏:未注销的 Scroll 监听与全局变量
  • 游泳池漆专用施工涂料如何选?专业视角解析耐水抗氯性能
  • 中国RFID设备十大企业综合实力解析
  • C#静态成员总结 常量与只读字段总结 类的继承总结
  • 都说东莞有好的AI销售厂家,实际情况真如此吗?
  • Python开发者必看:一行代码切换GPT-5.2与DeepSeek V3.2,企业级大模型中台搭建实录
  • 浏览器代理实现理想数据抓取
  • LeetCode 01 背包 完全背包 题型总结
  • ubuntu通过公网Ubuntu服务器远程桌面连接私网IPUbuntu
  • Unity学习笔记(十九)GUI控件(三)
  • IPA 深度混淆是什么意思?分析其与普通混淆的区别