嵌入式学习第二十八天--栈

栈的基本代码


栈是限定仅在表尾进行插入和删除操作的线性表。
先进后出、后进先出


栈顶:允许操作的一端
栈底:不允许操作的一端
入栈,出栈。
顺序栈 链式栈
30+2\5
1.创建 CreateSeqStack
2.销毁 DestroySeqStack
3.判断是否为空栈 IsEmptySeqStack
4.判断是否为满栈 IsFullSeqStack
5.压栈 PushSeqStack
6.出栈 PopSeqStack

seqstack.h

#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__typedef struct person
{char name[32];char sex;int age;int score;
} DATATYPE;typedef struct list
{DATATYPE *head;int tlen;int top; // 相当于clen
} SeqStack;// 创建
SeqStack *CreateSeqStack(int size);
// 销毁
int DestroySeqStack(SeqStack *ss);
// 新增元素 入栈
int PushSeqStack(SeqStack *ss, DATATYPE *data); // add
// 删除元素 出栈
int PopSeqStack(SeqStack *ss); // del
// 判断是否为空
int IsEmpySeqStack(SeqStack *ss);
// 判断是否为满
int IsFullSeqStack(SeqStack *ss);
// 获得栈顶元素
DATATYPE *GetTopSeqStack(SeqStack *ss);
int GetSizeSeqStack(SeqStack *ss);
#endif

seqstack.c


#include "./seqstack.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// 创建
SeqStack *CreateSeqStack(int size)
{SeqStack *ss = malloc(sizeof(SeqStack));if (NULL == ss){perror("CreateSeqStack malloc error\n");return NULL;}ss->head = malloc(sizeof(DATATYPE) * size);if (NULL == ss->head){perror("CreateSeqStack malloc2 error\n");return NULL;}ss->tlen = size;ss->top = 0;return ss;
}
// 销毁
int DestroySeqStack(SeqStack *ss)
{if (NULL == ss){fprintf(stderr, "DestroySeqStack pamter error\n");return 1;}free(ss->head);free(ss);return 0;
}
// 新增元素 入栈
int PushSeqStack(SeqStack *ss, DATATYPE *data)
{if (NULL == ss || NULL == data || IsFullSeqStack(ss)){fprintf(stderr, "PushSeqStack pamter error\n");return 1;}memcpy(&ss->head[ss->top], data, sizeof(DATATYPE));ss->top++;return 0;
}
// 删除元素 出栈
int PopSeqStack(SeqStack *ss)
{if (NULL == ss || IsEmpySeqStack(ss)){fprintf(stderr, "PopSeqStack pamter error\n");return 1;}ss->top--;return 0;
}
// 判断是否为空
int IsEmpySeqStack(SeqStack *ss)
{return 0 == ss->top;
}
// 判断是否为满
int IsFullSeqStack(SeqStack *ss)
{return ss->tlen == ss->top;
}
// 获得栈顶元素
DATATYPE *GetTopSeqStack(SeqStack *ss)
{if (NULL == ss || IsEmpySeqStack(ss)){fprintf(stderr, "GetTopSeqStack pamter error\n");return NULL;}return &ss->head[ss->top - 1];
}int GetSizeSeqStack(SeqStack *ss)
{if (NULL == ss){fprintf(stderr, "GetSizeSeqStack pamter error\n");return -1;}return ss->top;
}

main.c


#include "./seqstack.h"
#include <stdio.h>int main(int argc, char **argv)
{SeqStack *ss = CreateSeqStack(5);DATATYPE data[] = {{"zhangsan", 'm', 20, 80},{"lisi", 'f', 22, 86},{"wangmazi", 'f', 22, 67},{"guanerge", 'm', 40, 88},{"liubei", 'm', 42, 90},};int i = 0;for (i = 0; i < 5; i++){PushSeqStack(ss, &data[i]);}int len = GetSizeSeqStack(ss);for (i = 0; i < len; i++){DATATYPE *tmp = GetTopSeqStack(ss);printf("name:%s age:%d\n", tmp->name, tmp->age);PopSeqStack(ss);}DestroySeqStack(ss);// system("pause");return 0;
}

练习

遍历一个文件,查找文件中字符")" ,"]","}"是否存在正确的配对字符,如果不存在,打印错误信息,找出错误在文件中的第几行,以及是上面三种字符中的哪种字符导致的错误

seqstack.h

#ifndef __SEQSTACK_H__
#define __SEQSTACK_H__typedef struct person
{char sym;int linenum;int colnum;
} DATATYPE;typedef struct list
{DATATYPE *head;int tlen;int top; // 相当于clen
} SeqStack;// 创建
SeqStack *CreateSeqStack(int size);
// 销毁
int DestroySeqStack(SeqStack *ss);
// 新增元素 入栈
int PushSeqStack(SeqStack *ss, DATATYPE *data); // add
// 删除元素 出栈
int PopSeqStack(SeqStack *ss); // del
// 判断是否为空
int IsEmpySeqStack(SeqStack *ss);
// 判断是否为满
int IsFullSeqStack(SeqStack *ss);
// 获得栈顶元素
DATATYPE *GetTopSeqStack(SeqStack *ss);
int GetSizeSeqStack(SeqStack *ss);
#endif

seqstack.c


#include "./seqstack.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
// 创建
SeqStack *CreateSeqStack(int size)
{SeqStack *ss = malloc(sizeof(SeqStack));if (NULL == ss){perror("CreateSeqStack malloc error\n");return NULL;}ss->head = malloc(sizeof(DATATYPE) * size);if (NULL == ss->head){perror("CreateSeqStack malloc2 error\n");return NULL;}ss->tlen = size;ss->top = 0;return ss;
}
// 销毁
int DestroySeqStack(SeqStack *ss)
{if (NULL == ss){fprintf(stderr, "DestroySeqStack pamter error\n");return 1;}free(ss->head);free(ss);return 0;
}
// 新增元素 入栈
int PushSeqStack(SeqStack *ss, DATATYPE *data)
{if (NULL == ss || NULL == data || IsFullSeqStack(ss)){fprintf(stderr, "PushSeqStack pamter error\n");return 1;}memcpy(&ss->head[ss->top], data, sizeof(DATATYPE));ss->top++;return 0;
}
// 删除元素 出栈
int PopSeqStack(SeqStack *ss)
{if (NULL == ss || IsEmpySeqStack(ss)){fprintf(stderr, "PopSeqStack pamter error\n");return 1;}ss->top--;return 0;
}
// 判断是否为空
int IsEmpySeqStack(SeqStack *ss)
{return 0 == ss->top;
}
// 判断是否为满
int IsFullSeqStack(SeqStack *ss)
{return ss->tlen == ss->top;
}
// 获得栈顶元素
DATATYPE *GetTopSeqStack(SeqStack *ss)
{if (NULL == ss || IsEmpySeqStack(ss)){fprintf(stderr, "GetTopSeqStack pamter error\n");return NULL;}return &ss->head[ss->top - 1];
}int GetSizeSeqStack(SeqStack *ss)
{if (NULL == ss){fprintf(stderr, "GetSizeSeqStack pamter error\n");return -1;}return ss->top;
}

main.c

#include "./seqstack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int do_chekc(char *buf, SeqStack *ss, int num)
{int col = 1;DATATYPE data;while (*buf){DATATYPE *tmp = NULL;bzero(&data, sizeof(data));int c = *buf;switch (c){case '(':case '[':case '{':data.sym = c;data.linenum = num;data.colnum = col;PushSeqStack(ss, &data);break;case ')':tmp = GetTopSeqStack(ss);if (NULL == tmp){printf("read sym:%c ,line:%d col:%d\n", c, num, col);return 1;}if ('(' == tmp->sym){PopSeqStack(ss);}else{printf("read sym:%c ,line:%d col:%d  or top sym:%c ,line:%d col:%d\n", c, num, col, tmp->sym, tmp->linenum, tmp->colnum);return 1;}break;case ']':tmp = GetTopSeqStack(ss);if (NULL == tmp){printf("read sym:%c ,line:%d col:%d\n", c, num, col);return 1;}if ('[' == tmp->sym){PopSeqStack(ss);}else{printf("read sym:%c ,line:%d col:%d  or top sym:%c ,line:%d col:%d\n", c, num, col, tmp->sym, tmp->linenum, tmp->colnum);return 1;}break;case '}':tmp = GetTopSeqStack(ss);if (NULL == tmp){printf("read sym:%c ,line:%d col:%d\n", c, num, col);return 1;}if ('{' == tmp->sym){PopSeqStack(ss);}else{printf("read sym:%c ,line:%d col:%d  or top sym:%c ,line:%d col:%d\n", c, num, col, tmp->sym, tmp->linenum, tmp->colnum);return 1;}break;}buf++;col++;}return 0;
}
int main(int argc, char **argv)
{SeqStack *ss = CreateSeqStack(100);FILE *fp = fopen("./hello.c", "r");if (NULL == fp){perror("fopen");return 1;}int num = 1;int ret = 0;while (1){char buf[256] = {0};if (NULL == fgets(buf, sizeof(buf), fp)){break;}ret = do_chekc(buf, ss, num);if (1 == ret){DestroySeqStack(ss);exit(1);}num++;}if (IsEmpySeqStack(ss)){printf("file ok\n");}else{DATATYPE *tmp = GetTopSeqStack(ss);printf("top sym:%c ,line:%d col:%d\n", tmp->sym, tmp->linenum, tmp->colnum);}DestroySeqStack(ss);// system("pause");return 0;
}

例如创建一个hello.c文件,其中文件少了一个);

运行结果:

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

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

相关文章

MySQL中怎么分析性能?

MySQL中主要有4种方式可以分析数据库性能&#xff0c;分别是慢查询日志&#xff0c;profile&#xff0c;Com_xxx和explain。 慢查询日志 先用下面命令查询慢查询日志是否开启&#xff0c; show variables like slow_query_log;# 一般默认都是以下结果 ---------------------…

大模型在支气管哮喘手术全流程风险预测与治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目标与方法 1.3 研究创新点 二、支气管哮喘概述 2.1 定义与发病机制 2.2 分类与临床表现 2.3 诊断标准与方法 三、大模型技术原理与应用现状 3.1 大模型的基本原理 3.2 在医疗领域的应用案例分析 3.3 适用于支气管哮喘预…

《AI Agent智能应用从0到1定制开发》学习笔记:使用RAG技术增强大模型能力,实现与各种文档的对话

思维导图 &#x1f4da; 引言 大型语言模型&#xff08;如ChatGPT&#xff09;虽然功能强大&#xff0c;但它们存在一些明显的局限性。这些模型的知识库更新较慢&#xff0c;无法实时学习最新内容&#xff0c;而且对私有数据或特定领域的专业知识了解有限。例如&#xff0c;Ch…

Python 爬虫(4)HTTP协议

文章目录 一、HTTP协议1、HTTP特点2、HTTP工作原理3、HTTP与HTTPS的区别 前言&#xff1a; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是互联网上应用最为广泛的一种网络协议&#xff0c;用于在客户端和服务器之间传输超文本&#xf…

测试工程 常用Python库

以下是测试工程师在Python中必须掌握的常用库、框架以及提升日常工作效率的技巧总结&#xff1a; 一、必须掌握的Python库与框架 1. 测试框架 unittest Python内置的单元测试框架&#xff0c;提供测试用例、测试套件、断言等功能&#xff0c;适合单元测试和集成测试。核心组件…

【线程安全问题的原因和方法】【java形式】【图片详解】

在本章节中采用实例图片的方式&#xff0c;以一个学习者的姿态进行描述问题解决问题&#xff0c;更加清晰明了&#xff0c;以及过程中会发问的问题都会一一进行呈现 目录 线程安全演示线程不安全情况图片解释&#xff1a; 将上述代码进行修改【从并行转化成穿行的方式】不会出…

Infinite you:flexible photo recrafting while preserving your identity

基于DiT的id保留图像生成面临着多种挑战,缺乏定制模块设计,模型扩展的困难以及高质量数据的匮乏,因此基于flux的解决方案是相对稀缺的,pulid-flux是基于flux的id保留的初步尝试,包括instantx和xlabs-ai的flux.1-dev ip-adapters,现有方法在三个关键方面保险不足:1.身份相…

Unity 实现一个简易可拓展性的对话系统

本人能力有限,一切实现仅供参考,如有不足还请斧正 起因是我看到学校社团内有人做了对话系统的分享,我想了想之前没写过这种东西,而Fungus插件教程太老了,NodeCanvas插件学习成本又比较高,我就干脆寻找资料 加上自己迭代一下,花了一天时间完成了这个对话系统 目录 1.介绍 2.核…

linux常用指令(6)

今天我们继续学习一些linux常用指令,丰富我们linux基础知识,那么话不多说,来看. 1.cp指令 功能描述&#xff1a;拷贝文件到指定目录 基本语法&#xff1a;cp [选项] source dest 常用选项&#xff1a;-r&#xff1a;递归复制整个文件夹 拷贝文件&#xff1a; 拷贝文件夹&am…

Vue 3 中的路由传参详解※※※※

前言 在Vue应用中&#xff0c;路由传参是非常常见的需求&#xff0c;它允许我们在不同的组件之间传递数据。Vue Router提供了两种主要的方式来传递参数&#xff1a;query参数和params参数。下面我们将详细探讨这两种传参方式的使用方法和注意事项。 一、query参数 Query参数…

如何创建一个socket服务器?

1. 导入必要的库 首先&#xff0c;需要导入Python的socket库&#xff0c;它提供了创建和管理socket连接的功能。 python import socket 2. 创建服务器端socket 使用socket.socket()函数创建一个服务器端的socket对象&#xff0c;指定协议族&#xff08;如socket.AF_INET表示…

lua垃圾回收

lua垃圾回收 lua 垃圾回收 lua 垃圾回收 collectgarbage(“count”)获取当前lua脚本占用内存字节数(单位为KB)。 collectgarbage(“collect”)执行一次垃圾回收。 xxxnil 将变量置为空&#xff0c;会释放内存。 lua中的机制和c#中回收机制很类似 解除羁绊(置为空)。 --垃圾回…

友思特应用 | 行业首创:基于深度学习视觉平台的AI驱动轮胎检测自动化

导读 全球领先的轮胎制造商 NEXEN TIRE 在其轮胎生产检测过程中使用了基于友思特伙伴Neurocle开发的AI深度学习视觉平台&#xff0c;实现缺陷检测率高达99.96%&#xff0c;是该行业首个使用AI平台技术推动缺陷检测自动化流程的企业。 将AI应用从轮胎开发扩展到制造过程 2024年…

前后端+数据库的项目实战:hbu迎新网-较复杂(下)javaweb

目录 十一、实现对内容的富文本编辑&#xff08;换行、图片颜色等等样式&#xff09; &#xff08;1&#xff09;下载富文本编辑器&#xff0c;引入资源 &#xff08;2&#xff09;将原项目的内容部分替换为富文本编辑器 1、替换添加页面 2、替换修改页面&#xff08;和添…

脚本语言 Lua

概念 Lua由标准C编写而成&#xff0c;几乎在所有操作系统和平台上都可以编译、运行。Lua脚本可以很容易地被C/C 代码调用&#xff0c;也可以反过来调用C/C的函数&#xff0c;这使得Lua在应用程序中可以被广泛应用。Lua并没有提供强大的库&#xff0c;它是不适合作为开发独立应…

【数据分享】2000—2024年我国乡镇的逐月归一化植被指数(NDVI)数据(Shp/Excel格式)

之前我们分享过2000—2024年我国省市县三级逐月归一化植被指数&#xff08;NDVI&#xff09;数据&#xff0c;该数据是基于NASA定期发布的MOD13A3数据集中的月度NDVI栅格数据&#xff08;可查看之前的文章获悉详情&#xff09;计算得出。很多小伙伴拿到数据后反馈是否可以处理出…

【负载均衡系列】HAProxy

HAProxy(High Availability Proxy)是一款高性能的 ​TCP/HTTP 负载均衡器,专注于提供高可用性、灵活性和可靠性。以下是关于HAProxy的详细解析,涵盖其工作原理、工作机制、工作模式等核心方面: 一、HAProxy 工作原理 HAProxy的核心职责是将客户端请求高效、可靠地分发到后…

轻松迁移 Elasticsearch 数据:如何将自建索引导出并导入到另一个实例

概述 在日常的 Elasticsearch 运维和数据管理中&#xff0c;数据迁移是一个常见的需求。无论是为了备份、升级&#xff0c;还是将数据从一个集群迁移到另一个集群&#xff0c;导出和导入索引数据都是至关重要的操作。本文将详细介绍如何将自建 Elasticsearch 实例中的索引数据…

JVM 类加载器之间的层次关系,以及类加载的委托机制

JVM 类加载器之间存在一种层次关系&#xff0c;通常被称为双亲委派模型 (Parent Delegation Model)。这种层次关系和委托机制是 Java 类加载机制的核心&#xff0c;对于保证 Java 程序的安全性和避免类冲突至关重要。 1. 类加载器的层次关系: JVM 中的类加载器&#xff08;Cl…

基于 Vue 3 的PDF和Excel导出

以下是基于 Vue 3 Composition API 的完整实现&#xff0c;包括 PDF 和 Excel 导出。 一、PDF 导出 (Vue 3) 安装依赖 在项目中安装相关库&#xff1a; npm install html2canvas jspdf Vue 3 代码实现 <template><div><div ref"pdfContent" cla…