栈和队列栈 : 是限定在表尾进行插入和删除操作的线性表实现是一回事,但是必须要满足栈的基本特点它的设计思路是:先进后出,后进先出栈有两端1 栈顶(top) :插入数据删除数据都只能在这一端访问也只能访问栈顶2 栈底(bottom) : 栈底是不会动实现栈我们就需要实现如下操作:init    初始化这个栈top     返回栈顶元素,但是不出栈empty   判断栈是否为空size    栈里面有多少个元素push    入栈pop     出栈clear   清空这个栈destory 销魂这个栈我们可以使用链式结构或者顺序结构来实现这个栈1 链式 --- 利用链表,对链表的操作进行限定struct stacknode{int data;struct stacknode * prev;};//利用头节点来搞定stacknode的管理  对于用户来说是最友好的struct ListStack{struct stacknode * top;//指向栈顶元素的int num;//为了防止爆栈(溢出)  我们可以弄一个最大值来进行限定int maxnum;.....};2 顺序 --- 利用数组,对数组的操作进行限定struct ArrayStack //同样是为了管理我们的栈的{//int stack[];//容纳所有的栈里面的元素int * stack;//我给你开辟一个数组出来让stack去保存int  top;//指向栈顶元素的int num;//为了防止爆栈(溢出)  我们可以弄一个最大值来进行限定int maxnum;.....};先弄一遍链式栈,请实现顺序栈队列:是限定在表尾进行插入,在表头删除操作的线性表实现是一回事,但是必须要满足队列的基本特点它的设计思路是:先进先出,后进后出有两头:队头(front),删除操作在这一边进行队尾(rear),插入操作在这一边进行
队列在实现的时候有两种1 链式队列 --- 链表实现 -> 不存在假溢出struct queuenode{int data;struct queuenode * next;//做尾插};//利用头节点来搞定queuenode的管理  对于用户来说是最友好的struct ListQueue{struct stacknode * front;//指向队头元素的 删除的时候砍掉这个头struct stacknode * rear;//指向队尾元素的  插入的时候往rear的后面进行插入int num;//队列里面有多少个元素//为了防止爆队(溢出)  我们可以弄一个最大值来进行限定int maxnum;.....};2 顺序队列 --- 利用数组来实现根据队列的特点我们可以知道入队出队front rear都是在++总有一个时候队列没有满,但是入队的时候已经溢出了 -- 假溢出因此我们设计顺序队列一定要设计为循环队列让前面已经出队的地方可以继续容纳新的元素设计循环队列有几种思路1 用num来表示我们的循环队列里面有多少个元素只要num没有达到它的最大容纳上限我就可以继续入队只是rear跑到最后去了之后,我们需要让它从头开始2 我们可以利用front 和 rear来进行元素个数,是否为空,是否满的判断-> 没有变量num来对我们的元素个数来进行判断 ---- 这种是常用的根据我们的分析可以知道 当front == rear的时候没有办法判断这个队列是空的还满的因此循环队列设计的时候,我们实际队列容纳个数要比最大的容纳个数少一个maxnum == 5,实际队列容纳就是 5 - 1公式:队空的判断:front == rear队满的判断:(rear + 1) % maxnum == front队列的元素个数:(rear - front + maxnum) % maxnumstruct ArrayQueue //同样是为了管理我们的队列的{//int queue[];//容纳所有的队列里面的元素int * queue;//我给你开辟一个数组出来让queue去保存int  front;//指向对头元素的 指向要删除的数据int rear;//指向队尾元素 指向要插入的数据//为了防止爆队(溢出)  我们可以弄一个最大值来进行限定int maxnum; // 实际队列容纳个数为 maxnum - 1};队列需要实现如下操作init        初始化这个队列front       返回队头元素,但是不出队empty       判断是否为空full        判断是否为满size        返回元素个数push(inqueue)        入队pop(outqueue)         出队clear       清空这个队列destory     销毁这个队列搞定循环队列,然后将链式队列写出来栈最基本的应用就是算表达式的值2+3*5-6*7+8*9-10%3=你输入2+3*5-6*7+8*9-10%3=这个字符串简单一点就用scanf(%s) -> 中间就不能有空格回车就会得到它的结果gets -> 从终端获取一行字符串不想要警告,请使用fgets链式栈

.h与.c

#ifndef __LISTSTACK_H__
#define __LISTSTACK_H__#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>typedef int LS_DataType;
#define LS_ERRORVALUE (LS_DataType)(1 << 31)//栈的错误值//节点
typedef struct LS_Node
{LS_DataType _data;//栈的数据struct LS_Node * _next;//写next就用头插
}LS_Node;//管理栈的头节点
typedef struct
{LS_Node * _top;//栈顶  插入删除访问都这一端int _num;//现在栈里面有多少个元素int _maxnum;//最大的容纳个数
}ListStack;//init    初始化这个栈
//maxnum:程序员限定的最大元素个数   如果小于等于0   默认10000000
ListStack * ListStack_init(int maxnum);//top     返回栈顶元素,但是不出栈
//返回LS_ERRORVALUE表示失败
LS_DataType ListStack_top(ListStack * st);//empty   判断栈是否为空
bool ListStack_empty(ListStack * st);//full    判断是不是满了
bool ListStack_full(ListStack * st);//size    栈里面有多少个元素
int ListStack_size(ListStack * st);//push    入栈  失败返回false
bool ListStack_push(ListStack * st,const LS_DataType data);//pop     出栈 没有返回元素  失败返回false
//如果你有需求返回元素也是可以的
//如果你要得到出栈元素 你需要先top再pop
bool ListStack_pop(ListStack * st);//clear   清空这个栈
//callback是否要处理数据,传NULL为不处理
void ListStack_clear(ListStack * st,void (*callback)(const LS_DataType));//destory 销魂这个栈
//callback是否要处理数据,传NULL为不处理
void ListStack_destory(ListStack ** st,void (*callback)(const LS_DataType));#endif
#include "ListStack.h"//创建栈的节点  这个接口是不需要给用户用的
static LS_Node * LS_Node_create(const LS_DataType data)
{LS_Node * ptr = (LS_Node *)calloc(1,sizeof(LS_Node));ptr ->_data = data;return ptr;
}//init    初始化这个栈
//maxnum:程序员限定的最大元素个数   如果小于等于0   默认10000000
ListStack * ListStack_init(int maxnum)
{if(maxnum <= 0){maxnum = 10000000;}ListStack * st = (ListStack *)calloc(1,sizeof(ListStack));st ->_maxnum = maxnum;return st;
}//top     返回栈顶元素,但是不出栈
//返回LS_ERRORVALUE表示失败
LS_DataType ListStack_top(ListStack * st)
{if(ListStack_empty(st))//栈是空的 返回不了一点return LS_ERRORVALUE;return st ->_top ->_data;
}//empty   判断栈是否为空
bool ListStack_empty(ListStack * st)
{if(!st)return true;return st ->_num == 0;
}
//full    判断是不是满了
bool ListStack_full(ListStack * st)
{if(!st)return true;return st ->_num == st ->_maxnum;
}
//size    栈里面有多少个元素
int ListStack_size(ListStack * st)
{return !st ? 0 : st ->_num;
}//push    入栈  失败返回false
bool ListStack_push(ListStack * st,const LS_DataType data)
{//入栈就是一个头插if(!st || ListStack_full(st))return false;//先弄一个节点LS_Node * ptr = LS_Node_create(data);//对这个节点进行头插ptr ->_next = st ->_top;st ->_top = ptr;//将栈顶弄到新加入的节点上面来st ->_num++;return true;
}//pop     出栈 没有返回元素  失败返回false
//如果你有需求返回元素也是可以的
//如果你要得到出栈元素 你需要先top再pop
bool ListStack_pop(ListStack * st)
{if(!st || ListStack_empty(st))return false;//将top给删除LS_Node * ptr = st ->_top;//标记要删除的节点st ->_top = st ->_top ->_next;//top到后面去了st ->_num--;//数量少一个了ptr ->_next = NULL;//孤立这个节点free(ptr);return true;
}//clear   清空这个栈
//callback是否要处理数据,传NULL为不处理
void ListStack_clear(ListStack * st,void (*callback)(const LS_DataType))
{while(!ListStack_empty(st))//只要你的栈不是空的 就一直出栈{LS_DataType data = ListStack_top(st);//获取栈顶元素ListStack_pop(st);if(callback && LS_ERRORVALUE != data){callback(data);}}
}
//destory 销魂这个栈
//callback是否要处理数据,传NULL为不处理
void ListStack_destory(ListStack ** st,void (*callback)(const LS_DataType))
{if(!st)return;ListStack_clear(*st,callback);//先清空//将头节点给删除free(*st);*st = NULL;
}

顺序栈:

.h与.c

#ifndef __ARRAYSTACK_H__
#define __ARRAYSTACK_H__#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>typedef int AS_DataType;
#define AS_ERRORVALUE (AS_DataType)(1 << 31)//栈的错误值typedef struct  //同样是为了管理我们的栈的
{AS_DataType * _st_arr;//我给你开辟一个数组出来让_st_arr去保存数据int  _top;//指向栈顶元素的  下标 入栈从_top开始,栈顶元素为_top-1int _num;//为了防止爆栈(溢出)  我们可以弄一个最大值来进行限定int _maxnum;
}ArrayStack;//init    初始化这个栈
//maxnum:程序员限定的最大元素个数   如果小于等于0   默认10000000
ArrayStack * ArrayStack_init(int maxnum);//top     返回栈顶元素,但是不出栈
//返回LS_ERRORVALUE表示失败
AS_DataType ArrayStack_top(ArrayStack * st);//empty   判断栈是否为空
bool ArrayStack_empty(ArrayStack * st);//full    判断是不是满了
bool ArrayStack_full(ArrayStack * st);//size    栈里面有多少个元素
int ArrayStack_size(ArrayStack * st);//push    入栈  失败返回false
bool ArrayStack_push(ArrayStack * st,const AS_DataType data);//pop     出栈 没有返回元素  失败返回false
//如果你有需求返回元素也是可以的
//如果你要得到出栈元素 你需要先top再pop
bool ArrayStack_pop(ArrayStack * st);//clear   清空这个栈
//callback是否要处理数据,传NULL为不处理
void ArrayStack_clear(ArrayStack * st,void (*callback)(const AS_DataType));//destory 销魂这个栈
//callback是否要处理数据,传NULL为不处理
void ArrayStack_destory(ArrayStack ** st,void (*callback)(const AS_DataType));#endif
#include "ArrayStack.h"//init    初始化这个栈
//maxnum:程序员限定的最大元素个数   如果小于等于0   默认10000000
//入栈从_top开始,栈顶元素为_top-1
ArrayStack * ArrayStack_init(int maxnum)
{if(maxnum <= 0) {printf("动动你的猪脑,0和负数能存东西吗,给你开了10000000,慢慢填吧\n");maxnum = 10000000;}ArrayStack *st = (ArrayStack *)calloc(1,sizeof(ArrayStack));st ->_maxnum = maxnum;//开辟数组  用于保存数据st ->_st_arr = (AS_DataType *)calloc(st ->_maxnum,sizeof(AS_DataType));return st;
}//top     返回栈顶元素,但是不出栈
//返回LS_ERRORVALUE表示失败
AS_DataType ArrayStack_top(ArrayStack * st)
{if (ArrayStack_empty(st)) {return AS_ERRORVALUE;}return st ->_st_arr[st ->_top - 1];
}//empty   判断栈是否为空
bool ArrayStack_empty(ArrayStack * st)
{if (!st || st ->_num == 0) {return true;}return false;
}//full    判断是不是满了
bool ArrayStack_full(ArrayStack * st)
{if (!st || st ->_num == st ->_maxnum) {return true;}return false;
}//size    栈里面有多少个元素
int ArrayStack_size(ArrayStack * st)
{if (!st) {return AS_ERRORVALUE;}return st ->_num;
}//push    入栈  失败返回false
bool ArrayStack_push(ArrayStack * st,const AS_DataType data)
{if (!st || ArrayStack_full(st)) {return false;}st ->_st_arr[st ->_top] = data;st ->_top++;st ->_num++;return true;
}//pop     出栈 没有返回元素  失败返回false
//如果你有需求返回元素也是可以的
//如果你要得到出栈元素 你需要先top再pop
bool ArrayStack_pop(ArrayStack * st)
{if (ArrayStack_empty(st)) {return false;}st ->_top--;st ->_num--;return true;
}//clear   清空这个栈
//callback是否要处理数据,传NULL为不处理
void ArrayStack_clear(ArrayStack * st,void (*callback)(const AS_DataType))
{while (!ArrayStack_empty(st)) {ArrayStack_pop(st);}
}//destory 销魂这个栈
//callback是否要处理数据,传NULL为不处理
void ArrayStack_destory(ArrayStack ** st,void (*callback)(const AS_DataType))
{free((*st) ->_st_arr);free(*st);*st =NULL;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92092.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92092.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/92092.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三、Spark 运行环境部署:全面掌握四种核心模式

作者&#xff1a;IvanCodes 日期&#xff1a;2025年7月25日 专栏&#xff1a;Spark教程 Apache Spark 作为统一的大数据分析引擎&#xff0c;以其高性能和灵活性著称。要充分利用Spark的强大能力&#xff0c;首先需要根据不同的应用场景和资源环境&#xff0c;正确地部署其运行…

【Django】-2- 处理HTTP请求

一、request 请求 先理解&#xff1a;Request 是啥&#xff1f;用户访问你的网站时&#xff0c;会发一个 “请求包” &#x1f4e6; &#xff0c;里面装着&#xff1a;想访问啥路径&#xff1f;用啥方法&#xff08;GET/POST 等&#xff09;&#xff1f;带了啥头信息&#xff0…

飞算 JavaAI:突破效率边界的代码智能构造平台

飞算 JavaAI&#xff1a;突破效率边界的代码智能构造平台 一、引言&#xff1a;数字化浪潮下的开发效率困局与破局路径 当企业数字化转型驶入深水区&#xff0c;软件开发正面临需求迭代频次激增、人力成本高企、技术架构复杂化的多重挑战。传统开发模式中&#xff0c;从需求分…

国家科学技术奖答辩PPT案例_科技进步奖ppt制作_技术发明奖ppt设计美化_自然科学奖ppt模板 | WordinPPT

“国家科学技术奖”是在科学技术领域设立的最高荣誉&#xff0c;旨在奖励在科学技术进步活动中做出突出贡献的个人和组织&#xff0c;从而推动国家科学技术事业的发展&#xff0c;加快建设科技强国。科学技术奖是国内科技界的最高殿堂&#xff0c;是对做出杰出贡献的科技工作者…

如何通过黑白棋盘进行定位配准融合?(前后安装的两个相机)

一.总结: 完整流程 &#xff1a;硬件准备 → 数据采集 → 空间统一 → 相机标定&#xff08;内参畸变&#xff09; → 外参求解 → 定位配准融合 → 校验 → 生成映射表 → 上线remap验证 我们场景流程 &#xff1a;硬件准备 → 数据采集 → 空间统一 → 定位配准融合 → …

【node】token的生成与解析配置

在用户登录成功之后为了记录用户的登录状态通常会将用户信息编写为一个token&#xff0c;通过解析token判断用户是否登录。 token的生成 JSON Web Token&#xff08;JWT&#xff09; 是一种基于JSON的轻量级身份验证和授权机制。它是一种开放标准&#xff08;RFC 7519&#xff…

yolo 、Pytorch (5)IOU

一、简介 IOU的全称为交并比&#xff08;Intersection over Union&#xff09;&#xff0c;是目标检测中使用的一个概念&#xff0c;IoU计算的是“预测的边框”和“真实的边框”的交叠率&#xff0c;即它们的交集和并集的比值。最理想情况是完全重叠&#xff0c;即比值为1。 …

【银河麒麟服务器系统】自定义ISO镜像更新内核版本

自定义ISO镜像更新内核版本 镜像制作流程 环境 更新仓库 准备新版本内核包 内核清单简介 已下载软件包版本 更新内核包 更新镜像源 制作自动化镜像 修改引导 修改UEFI引导 传统引导 修改ks文件内容 打包镜像 mkisofs参数说明 封装镜像命令 常见问题解决方案 镜像制作流程 #merm…

JVM 调优中JVM的参数如何起到调优动作?具体案例,G1GC垃圾收集器参数调整建议

JVM调优参数 在JVM调优过程中&#xff0c;通过调整JVM参数可以优化Java应用程序的性能。不同的应用场景可能需要不同的调优策略和参数配置。下面将介绍几个常见的调优场景以及相应的JVM参数设置&#xff0c;并给出具体案例说明。 1. 堆内存大小调整 问题描述&#xff1a;应用程…

TGD第十一篇:卷积神经网络中的TGD特征

文章目录一、直觉上重要的视觉特征二、视觉神经网络首层试图自主学习 TGD 算子权重2.1 AlexNet2.2 Vision Transformer2.3 MLPMixer三、针对直觉的验证试验3.1 小样本集自然图像分类任务3.2 小样本集医学图像分割任务四、结语早在 2012 年&#xff0c;卷积神经网络 AlexNet 就已…

【源力觉醒 创作者计划】文心大模型开源:从封闭研发到生态共建的转折点

前言 人工智能的浪潮在近几年席卷全球&#xff0c;不仅颠覆了传统技术路径与行业习惯&#xff0c;更在大模型领域掀起了一场激烈的生态争夺战。自去年起&#xff0c;"百模大战"的硝烟弥漫&#xff0c;微软、谷歌、百度、阿里等科技巨头纷纷入局&#xff0c;在大模型的…

思科 UCS Fabric Interconnect 和 UCS Manager 简介

UCS Manager&#xff08;UCSM&#xff09;安装在 Fabric Interconnect&#xff08;FI&#xff09;上&#xff0c;并且是UCS架构的集中管理平台&#xff0c;允许你管理所有与计算、网络和存储相关的配置。1. UCS Manager 安装位置UCS Manager 是在 UCS Fabric Interconnect&…

C语言结构体、位段、枚举、联合体

结构体&#xff1a;定义&#xff1a;结构体就是一堆值的集合初始化&#xff1a;#include<stdio.h> #include <stddef.h> struct S {char ch;int n; };int main() {struct S s1 { a, 5 };S s2{ b,6 };printf("s1 ch:%c , n:%d\n", s1.ch, s1.n);printf(&…

AI产品经理面试宝典第61天:AI产品体验、数据安全与架构实战解析

1. 如何提升 AI 产品的用户体验? 1.1 问:如何提升 AI 产品的用户体验? 答: 提升 AI 产品的用户体验可以从以下几个方面入手: 可解释性增强:AI模型的输出往往较为“黑盒”,用户难以理解其决策逻辑。通过可视化、自然语言解释、关键特征展示等方式,增强用户对AI决策过程…

以微服务为基础搭建一套脚手架开始前的介绍

书接上回<java一个脚手架搭建-CSDN博客> 这个脚⼿架项⽬开发前&#xff0c;你要大概的了解一下这些东西&#xff1a; Java基础、IDEA使⽤、Maven基础 • Linux基础 • Springboot/Spring Cloud 基础 • MySQL基础 • Redis基础 • RabbitMQ基础 • Docker基础 • Git基…

Excel接入deepseek

先进入deepseek官网&#xff1a;DeepSeek | 深度求索 点击API开放平台&#xff1a; 确保余额里有钱: 创建APIkey: 复制到.txt文件中储存好 插入VBA代码&#xff1a; Function OptimizeEbayTitle(originalTitle As String) As StringDim Prompt As StringPrompt "作为…

【计组】概述

目录 计算机层次结构 计算机硬件 所有用户&#xff08;程序员&#xff09;可见 所有用户&#xff08;程序员&#xff09;透明 汇编程序员可见 计算机软件 从源程序到可执行文件 计算机性能指标 字长 运算速度 单位换算 存储 速率 时间 计算机层次结构 计算机硬件…

Web15题(7.28~8.3)

&#xff08;1&#xff09;SQL注入 [NSSRound#1 Basic]sql_by_sql 登录界面 尝试二次注入覆盖 admin 用户&#xff0c;但是发现注释符 # 被过滤了&#xff0c;--可以 但是无效了 奥原来是密码输错了 然后进行修改密码&#xff0c;修改以后就可以登录admin账户 查询按钮也不…

《Python 实用项目与工具制作指南》· 1.2 选择与配置Python代码编辑器

1.2 选择与配置 Python 代码编辑器 安装好 Python 环境后&#xff0c;我们还需要一款合适的代码编辑器来编写、运行和调试代码。就像作家需要趁手的钢笔&#xff0c;程序员也需要好用的编辑器 —— 它能帮你自动补全代码、高亮语法错误&#xff0c;让开发 “题目数据生成器”“…

Kali基础知识点【2】

Nmap信息收集nmap&#xff1a;网络扫描器&#xff0c;收集网络信息 openVAS:系统漏洞扫描器Nmap基础命令 nmap 目标主机&#xff1a;收集开放的端口 nmap -O 目标主机&#xff1a;收集目标主机的操作系统 nmap -sP 网段/子网掩码&#xff1a;扫描目标网段上开启的主机 nmap -sV…