news 2026/6/10 8:52:17

c语言——栈和队列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:33:56

“ Executor框架: Java多线程的正确打开方式”、“为什么不用自己造轮子? 从Executor框架看线程管理的艺术”、“Java多线程管理,别再 reinvent the wheel! ”

文章目录Executor框架&#xff1a; Java多线程的正确打开方式引言&#xff1a;别再 reinvent the wheel&#xff01;一、Executor框架是什么&#xff1f;1.1 线程管理的艺术1.2 Executor 和 ExecutorService1.3 线程池的分类二、为什么要用 Executor 框架&#xff1f;2.1 线程管…

作者头像 李华
网站建设 2026/6/10 11:41:31

基于 Docker + GitLab + Kubernetes 的 CI/CD 流程实践

基于 Docker GitLab Kubernetes 的 CI/CD 流程实践 一、 引言二、核心概念&#xff1a;CI 与 CD2.1 持续集成&#xff08;Continuous Integration, CI&#xff09;核心目标 2.2 持续部署&#xff08;Continuous Deployment, CD&#xff09;CD 核心价值 三、 Docker GitLab …

作者头像 李华
网站建设 2026/6/10 1:50:31

刘二大人PyTorch深度学习实践第二讲笔记

个新坑&#xff0c;系统学一遍深度学习好做毕设&#xff0c;能到河工大挺激动的&#xff0c;赶紧给刘二大人投自荐简历&#xff0c;但是已读不回&#xff0c;还是自己太菜了........不过已经到河工大了挺好的&#xff0c;梦校第二讲线性模型image-20251125141224993image-20251…

作者头像 李华
网站建设 2026/6/10 14:39:25

再探二分查找

各位好久不见&#xff0c;不知不觉2025都快要结束了&#xff0c;是时候来再总结一次算法&#xff08;入门&#xff09;的经验了。 最近笔者看标准算法库时&#xff0c;注意到C算法库中只有两种二分查找的方法&#xff1a;lower_bound和upper_bound&#xff0c;分别用来查找第一…

作者头像 李华
网站建设 2026/6/9 19:59:33

自动化运维利器Ansible

前言 在如今的IT环境中&#xff0c;服务器数量越来越多&#xff0c;业务流程也越来越复杂。如果还靠手工登录每台服务器操作&#xff0c;不仅效率低&#xff0c;还容易出错。这时候&#xff0c;自动化运维工具就成了运维工程师的“救星”。 Ansible作为其中的佼佼者&#xff0c…

作者头像 李华