数据结构和算法—栈的计算表达式(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天前
|
存储 JSON NoSQL
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
这篇文章是关于Redis基本数据结构的学习笔记,包括了String、Hash、Set、List和SortedSet的介绍和常用命令。文章解释了每种数据结构的特点和使用场景,并通过命令示例演示了如何在Redis中操作这些数据结构。此外,还提供了一些练习示例,帮助读者更好地理解和应用这些数据结构。
redis基本数据结构(String,Hash,Set,List,SortedSet)【学习笔记】
|
1月前
|
算法
【初阶数据结构】复杂度算法题篇
该方法基于如下的事实:当我们将数组的元素向右移动 k 次后,尾部 kmodn 个元素会移动至数组头部,其余元素向后移动 kmodn 个位置。
|
1月前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
43 2
|
1月前
|
算法
【初阶数据结构篇】二叉树算法题
二叉树是否对称,即左右子树是否对称.
|
1月前
|
算法 索引
【初阶数据结构篇】单链表算法题进阶
深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。
|
1月前
|
存储 算法
【初阶数据结构篇】顺序表和链表算法题
此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。
|
23天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
23天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
24天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
25天前
|
算法
基于SIR模型的疫情发展趋势预测算法matlab仿真
该程序基于SIR模型预测疫情发展趋势,通过MATLAB 2022a版实现病例增长拟合分析,比较疫情防控力度。使用SIR微分方程模型拟合疫情发展过程,优化参数并求解微分方程组以预测易感者(S)、感染者(I)和移除者(R)的数量变化。![]该模型将总人群分为S、I、R三部分,通过解析或数值求解微分方程组预测疫情趋势。