数据结构和算法—栈的计算表达式(4)|学习笔记

简介: 快速学习数据结构和算法—栈的计算表达式(4)

开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法—栈的计算表达式(4)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/627/detail/9859


数据结构和算法—栈的计算表达式(4) 

 

解决多位数的问题

上节最终分到该表达式涉及到多位数的问题,接下来做一个处理。

需要增加一个逻辑就是处理多位数的问题,解决的核心,如果是一个操作符,if相关的内容没有问题

主要的问题在代码:

else{//说明是数

val,_ := strconv.ParseInt(ch, 10, 64)

numStack.Push(int(val))

}

因为上述代码中直接将 ch 做了一个处理

处理多位数的思路:

1.先定义一个变量 keepNum string拼接

2. 怎么判断下面不是一个字符串呢?

需要每次在扫描时都向 index 后面字符测试一下,看看是不是运算符,然后处理。

如果已经到表达式最后,直接将 keepNum 转成指数加入

接下来先定义变量:

在 for 循环上添加代码:

keepNum := “”

再在代码上述else{}的代码中做一个判断,输入:

if index == len(exp) -1{

val,_ := strconv.ParseInt(keepNum,10,64)

numStack.Push(int(val))  //转完后直接压入

}else{

//向 index 后面测试看看是否是运算符 [index]

ifoperStack.IsOper(int([]byte(exp[index+1:index+2])[0])){//取出 index 后转成 byte 切片,然后取出第0个值,取出后转成 int

//如果是一个操作符,

说明结束,再探运算符就不需要拼接

val,_ := strconv.ParseInt(keepNum,10,64)

numStack.Push(int(val))

keepNum = “”

//做完后要进行清空,否则会在原先基础上继续进行拼接

}

}

然后注释掉修改代码下的

val,_ := strconv.ParseInt(ch, 10, 64)

numStack.Push(int(val))

总结:

先看否已经到表达式最后,如果是到最后直接压入是操作符;如果不是到最后,就向后看一位是否是操作符:

如果是操作符就压入,如果不是操作符就继续拼

最后还需要一步如果不是操作符继续拼接的操作:

else{} 中的 if 上添加输入:

keepNum +=ch

即说明是数进入到 else 中后先进行拼接,因为 num 原先是空的,先拼接一个,后面是否继续拼接取决于下方的if逻辑。

修改完之后,现在就是要做30+3*6-4

运行一下,结果显示30+3*6-4=44 结果正确

再做一个运算30+30*6-4,看是否正确

运行结果显示30+30*6-4=206正确

再来运算30+30*6-4-6,结果显示30+30*6-4-6=200

基本代码已经完成,但是要想写计算器这种完整的代码,有大括号和小括号的代码,还是比较麻烦,这节讲栈的目的是看运算层怎么运行,和栈的使用场景。

总结笔记:

以上就是对栈的综合计算器运用,主要讲了分析实现的思路

分析实现的思路前节已经讲到,

如下图

image.png

1. 创建两个栈,numStack,operStack

2. numStack 存放数,operStack 操作符

3. index :=0

4. exp 计算表达式,是一个字符串

5. 如果扫描发现是一个数字,则直接入 numStack

6. 如果发现是一个运算符。

1) 如果 operStack 是 一个空栈,直接入栈

2) 如果 operStack 不是一个空栈

2.1

如果发现 operStack 栈顶的运算符的优先级大于等于当前准备入栈的运算符的优先级,就从符号栈 pop 出,并从数栈也 pop 两个数,进行运算,运算后的结果再重新入栈到数栈,当前符号再入符

2.2

否则,运算符就直接入栈

7.如果扫描表达式完毕,依次从符号栈取出符号,然后从数栈取出两个数,运算后的结果,入数栈,直到符号栈为空

 

相关文章
|
1月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
86 29
|
1月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
94 25
|
1月前
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
72 23
|
2月前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
55 2
|
7天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
80 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
|
12天前
|
算法
基于遗传优化算法的风力机位置布局matlab仿真
本项目基于遗传优化算法(GA)进行风力机位置布局的MATLAB仿真,旨在最大化风场发电效率。使用MATLAB2022A版本运行,核心代码通过迭代选择、交叉、变异等操作优化风力机布局。输出包括优化收敛曲线和最佳布局图。遗传算法模拟生物进化机制,通过初始化、选择、交叉、变异和精英保留等步骤,在复杂约束条件下找到最优布局方案,提升风场整体能源产出效率。
|
12天前
|
算法 安全 机器人
基于包围盒的机械臂防碰撞算法matlab仿真
基于包围盒的机械臂防碰撞算法通过构建包围盒来近似表示机械臂及其环境中各实体的空间占用,检测包围盒是否相交以预判并规避潜在碰撞风险。该算法适用于复杂结构对象,通过细分目标对象并逐级检测,确保操作安全。系统采用MATLAB2022a开发,仿真结果显示其有效性。此技术广泛应用于机器人运动规划与控制领域,确保机器人在复杂环境中的安全作业。
|
12天前
|
机器学习/深度学习 数据采集 算法
基于WOA鲸鱼优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB 2022a实现时间序列预测,采用CNN-GRU-SAM网络结构,结合鲸鱼优化算法(WOA)优化网络参数。核心代码含操作视频,运行效果无水印。算法通过卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征,全连接层整合输出。数据预处理后,使用WOA迭代优化,最终输出最优预测结果。
|
6天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络
本项目展示了人脸识别算法的运行效果(无水印),基于MATLAB2022A开发。核心程序包含详细中文注释及操作视频。理论部分介绍了广义回归神经网络(GRNN)、概率神经网络(PNN)、深度神经网络(DNN)和反向传播(BP)神经网络在人脸识别中的应用,涵盖各算法的结构特点与性能比较。
|
4天前
|
编解码 算法 数据安全/隐私保护
一维信号的小波变换与重构算法matlab仿真
本程序使用MATLAB2022A实现一维信号的小波变换与重构,对正弦测试信号进行小波分解和重构,并计算重构信号与原信号的误差。核心步骤包括:绘制分解系数图像、上抽取与滤波重构、对比原始与重构信号及误差分析。小波变换通过多分辨率分析捕捉信号的局部特征,适用于非平稳信号处理,在信号去噪、压缩等领域有广泛应用。