数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值特殊矩阵的压缩存储
文章目录
- 栈的应用
- 1.栈的括号匹配
- 代码实战:
- 问题分析:
- 2.栈的表达式求值
- 2.1 中缀、后缀、前缀表达式
- 2.2 中缀表达式改写为后缀表达式(手算)
- 2.3 后缀表达式的计算(手算)
- 2.4 中缀表达式转前缀表达式(手算)和计算前缀表达式
- 2.5后缀表达式的计算(机算)
- 2.6 中缀表达式转后缀表达式(机算)
- 2.7 中缀表达式的计算(栈实现)
- 3.矩阵的压缩存储
- 3.1 对称矩阵的压缩存储
- 3.2 三角矩阵的压缩存储
- 3.3 三对角矩阵(带状矩阵)
- 3.4 稀疏矩阵压缩存储
- 3.4.1 存储方法一 结构体方式存储
- 3.4.2 存储方法二 十字链表法
栈的应用
1.栈的括号匹配
问题分析:
问题还是很简单就是,利用栈的特性,左括号进栈,右括号出栈实现匹配,在栈空且所有括号都扫过一遍后结束

代码实战:
南京理工大学上机题目
苗苗今天刚刚学会使用括号,不过他分不清小括号,中括号,大括号和尖括号,不知道怎么使用这些括号,请帮助他判断括号使用是否正确。
注意:不需要区分括号的优先级。
输入格式
共一行,包含一个由 <,(,{,[,>,),},] 构成的字符串。
输出格式
如果输入的字符串中的括号正确匹配则输出 yes,否则输出 no。
数据范围
输入字符串长度不超过 10000
输入样例:
(){}
输出样例:
yes
问题分析:
- 想到用栈来实现括号匹配的问题
- 第一步,肯定是实现栈的基础操作(当然为了简单快捷,选择静态存储的方式实现栈)
- 栈的定义
- 栈的初始化
- 入栈
- 出栈
- 判空
- 具体问题具体分析
- 写一个括号匹配函数,模拟整个过程
- 主函数中补上字符串的输入
完整代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MaxSize 100001
typedef struct{char data[MaxSize]; //静态数组存放栈中元素 int top; // 栈顶元素
}SqStack;void InitSqStack(SqStack &S)
{S.top=-1;
}bool StackEmpty(SqStack S)
{if(S.top==-1)return true;return false;
}bool Push(SqStack &S,char x)
{S.data[++S.top]=x;return true;
}bool Pop(SqStack &S,char &x)
{x=S.data[S.top--];return true;
}bool BracketCheck(char str[])
{SqStack S;InitSqStack(S);for(int i=0;i<strlen(str);i++) //-1是因为fgets函数读入最后一个字符是/n要去掉 {if(str[i]=='<'||str[i]=='('||str[i]=='{'||str[i]=='[') //匹配到左括号 {Push(S,str[i]);}else //匹配到右括号 { char x; Pop(S,x);if(str[i]=='>'&&x!='<')return false;if(str[i]==')'&&x!='(')return false;if(str[i]=='}'&&x!='{')return false;if(str[i]==']'&&x!='[')return false;}}return StackEmpty(S); //检索完全部括号后,栈空说明匹配成功
}
int main()
{char str[MaxSize];fgets(str,MaxSize,stdin);// 检查字符串的最后一个字符是否为换行符,并去除它 int len = strlen(str); if (len >0&&str[len-1] =='\n') { str[len-1] ='\0'; } if(BracketCheck(str))printf("yes");else printf("no");
}

2.栈的表达式求值
2.1 中缀、后缀、前缀表达式
在学习栈的表达式求值之前 明确的概念
中缀表达式(符号在中间)
a+b
a+b-c
后缀表达式(符号在后边)
ab+
ab+c-
前缀表达式(符号在前边)
+ab
-+abc
引子:为学习计算机机算做铺垫,计算机更喜欢处理后缀表达式这种形式
2.2 中缀表达式改写为后缀表达式(手算)
- 从左到右的找符号,找到合适的符号就把符号两边的操作数和符号写成后缀表达式的形式

2.3 后缀表达式的计算(手算)
- 从左往右扫描,每遇到一个运算符,就让运算符前面最近的两个操作数执行对应运算,合体为一个操作数

从左往右我们发现,最后出现的操作数先被运算,想到栈这种数据结构
2.4 中缀表达式转前缀表达式(手算)和计算前缀表达式
类似于中缀表达式改写为后缀表达式,只是遵循的是右优先原则

类似于后缀表达式的计算,但是是从右边开始依次入栈,遇到符号出栈…
2.5后缀表达式的计算(机算)
- 从左到右扫描,
- 遇到操作数就入栈,遇到符号就将栈顶两个操作数出栈,符号计算完再入栈
- 直到全部扫描一遍后,若表达式合法,最后栈中只会留下一个结果就是最后结果

2.6 中缀表达式转后缀表达式(机算)
- 遇到操作数,直接加入后缀表达式
- 遇到界限符,遇到"(“直接入栈,直到遇见”)“,把此时”(“上面的所有运算符都依次出栈加入后缀表达式,注意”(“不加入,”)"也入栈
- 遇到运算符。依次弹出栈中优先级高于或等于当前运算符的所有运算符,并加入后缀表达式,若碰到“(”或栈空则停止。之后再把当前运算符入栈。
2.7 中缀表达式的计算(栈实现)
本质就是将中缀表达式转后缀表达式和后缀表达式的计算结合起来
用栈实现中缀表达式的计算:
初始化两个栈,操作数栈和运算符栈若扫描到操作数,压入操作数栈
若扫描到运算符或界限符,则按照“中缀转后缀”相同的逻辑压入运算符栈(期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈的栈顶元素并执行相应运算,运算结果再压回操作数栈)

矩阵的压缩存储通过数组的形式来实现
3.矩阵的压缩存储
3.1 对称矩阵的压缩存储
对称矩阵


- 对称矩阵大小存储的大小是多少
(1+n)*n/2
- 按行优先的原则,ai,j是第几个元素(注意是第几个元素)
先算前面行一共有多少个,再加上当前的列坐标
1+2+3+…(i-1)再+j 个元素即i(i-2)/2+j个元素
如果是下标那就得-1
3.2 三角矩阵的压缩存储
下三角矩阵和上三角矩阵

压缩存储策略:按行优先原则将橙色区元素存入一维数组中。并在最后一个位置存储常量c

按行优先的原则,ai,j是第几个元素(注意是第几个元素)跟对称矩阵是一样的,当i<j的时候就是那个常数c,即n(n+1)/2
3.3 三对角矩阵(带状矩阵)
什么是三对角矩阵?

主对角元素的矩阵,上下左右下标差值不等于1的情况下为0

按行优先的原则,ai,j是第几个元素
前i-1行共3(i-1)-1个元素
ai,j是i行第j-i+2个元素
ai,j是第2i+j-2个元素
如果数组下标从0开始 k=2i+j-3
若已知数组下标k,如何得到i, j ?
前i-1行共3(i-1)-1个元素
前i行共3i-1个元素
显然,3(i-1)-1 <k+1 ≤ 3i-1
3.4 稀疏矩阵压缩存储
稀疏矩阵:非零元素远远少于矩阵元素的个数
压缩存储策略:
顺序存储―一三元组<行,列,值>
3.4.1 存储方法一 结构体方式存储
定义一个结构体,存储i,j,v
3.4.2 存储方法二 十字链表法


相关文章:
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值特殊矩阵的压缩存储
文章目录 栈的应用1.栈的括号匹配代码实战:问题分析:2.栈的表达式求值2.1 中缀、后缀、前缀表达式2.2 中缀表达式改写为后缀表达式(手算)2.3 后缀表达式的计算(手算)2.4 中缀表达式转前缀表达式(手算)和计算前缀表达式2.5后缀表达式的计算(机算)2.6 中缀表达式转后缀…...
C# 关于多线程同步不同实现方式
栏目总目录 AutoResetEvent class MainClass {// the array of consumer threadsprivate static List<Thread> consumers new List<Thread> ();// the task queueprivate static Queue<Action> tasks new Queue<Action>();// the synchronisation o…...
【人工智能学习笔记】4_2 深度学习基础之多层感知机
感知机概述 感知机是人工智能最早的模型,是一种有监督的算法,本质上是一个二分类问题,是神经网络和支持向量机的基础缺点:感知机智能解决单纯的线性问题 感知机的过程 多层感知机的层级结构 多层感知机的层级结构主要包括输入层、隐藏层和输出层、可以用于拟合非线性函数。…...
WPS2019如何打出各种横线
WPS2019如何打出各种横线 测试于WPS2019...
Vue获取后端重定向拼接的参数
前言 比如我们要重定向这样一个连接: http://192.168.2.189:8081?nameadmin springboot重定向: Vue获取: getParam(param) {var reg new RegExp("(^|&)" param "([^&]*)(&|$)");var r location.searc…...
vscode spring boot项目编辑yaml不自动提示补全如何解决
文章目录 properties能够自动弹出提示但是YAML文件就不会自动弹出提示ctrl空格不出提示的解决办法 properties能够自动弹出提示 但是YAML文件就不会自动弹出提示 只是不会自动弹出来而已,按ctrl空格即可解决 ctrl空格不出提示的解决办法 如果按ctrl空格没有用 …...
算法练习题19——leetcode141环形链表
题目描述 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置&a…...
基于人类反馈的强化学习概述
文章目录 RLHF 概述人类反馈数据的收集由于对齐标准难以通过形式化的优化目标进行建模,因此研究人员提出了基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF),引入人类反馈对大语言模型的行为进行指导。我们将首先介绍基于人类反馈的强化学习的整…...
【SIT1463Q】带振铃抑制功能的CAN收发器,替代TJA1463
【SIT1463Q】带振铃抑制功能的CAN收发器,替代TJA1463 SIT1463Q核心亮点: 满足ISO11898-2:2016高速CAN规范的物理层要求和CiA601-4:2019 SIC规范要求。 支持高达8Mbps的数据速率。 更稳定的位时序,比特对称性增强,降低…...
CCF刷题计划——坐标变换(其二)(前缀和)
坐标变换(其二) 首先我按照一般的逻辑写出来,居然超时了??? 之后想了想,还是觉得大有可为的,对拉伸前缀积,对旋转前缀和成功解决问题。 80分:超时 #inclu…...
游戏开发简述
《黑神话:悟空》爆红后,游戏开发一时成为热点。作为个人或小公司,能否进入游戏开发领域。从纯技术角度而言,并不是可望不可即: 另:学会了,哪怕自己干不成,招游戏开发的岗位也不少&am…...
最新前端开发VSCode高效实用插件推荐清单
在此进行总结归类工作中用到的比较实用的、有助于提升开发效率的VSCode插件。大家有其他的好插件推荐的也欢迎留言评论区哦😄 基础增强 Chinese (Simplified) Language Pack: 提供中文界面。 Code Spell Checker: 检查代码中的拼写错误。 ESLint: 集成 ESLint&…...
分布式调度方案:Elastic-Job
文章目录 一、什么是分布式调度二、Elastic-Job 介绍三、Elastic-Job 实战3.1 环境搭建3.1.1 本地部署3.1.2 服务器部署3.1.3 Zookeeper 管控台界面 3.2 入门案例3.3 SpringBoot 集成 Elastic-Job3.4 任务分片(★)3.5 Dataflow 类型调度任务 一、什么是分…...
网络安全工程师(白帽子)企业级学习路线
第一阶段:安全基础(入门) 第二阶段:Web渗透(初级网安工程师) 第三阶段:进阶部分(中级网络安全工程师)...
数据结构详细解释
数据结构 1. 线性数据结构 数组(Array) 定义:数组是一种固定大小的、元素类型相同的线性数据结构。元素在内存中是连续存储的,可以通过索引直接访问。 特点: 支持常数时间的随机访问(O(1))。…...
7.1图像平移
目录 实验原理 示例代码1 运行结果1 示例代码2 运行结果2 实验原理 OpenCV中,图像平移是一种基本的几何变换,指的是将图像中的每一个像素点沿着水平方向或垂直方向移动一定的距离。图像平移不改变图像…...
海外云手机是否适合运营TikTok?
随着科技的迅猛发展,海外云手机逐渐成为改变工作模式的重要工具。这种基于云端技术的虚拟手机,不仅提供了更加便捷、安全的使用体验,还在电商引流和海外社媒管理等领域展示了其巨大潜力。那么,海外云手机究竟能否有效用于运营TikT…...
IT 行业中常见的专业名称及其含义
API(Application Programming Interface) API 是应用程序编程接口,定义了不同软件系统之间如何互相通信的规则和方式。开发人员使用 API 将应用程序与外部服务集成,进行数据交换或调用外部功能。 IDE(Integrated Deve…...
全球开店,Shopee东南亚入驻指南|用友BIP电商通引领电商出海新潮流
在全球化的浪潮中,东南亚市场以其蓬勃的发展态势成为中国企业出海的首选之地。得益于其语言、物流、仓储、距离及政策的友好性,东南亚市场已成为企业海外拓展的必争之地。作为东南亚领先的电商平台,Shopee以其庞大的用户基础和高度的用户活跃…...
java当中什么是NIO
Java中的NIO(Non-blocking I/O)即非阻塞I/O,是Java 1.4中引入的一种新的I/O API,用于替代传统的I/O(即BIO, Blocking I/O)。与传统的阻塞式I/O相比,NIO提供了更高效的I/O操作,特别是…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

