数据结构和算法—栈的计算表达式(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.如果扫描表达式完毕,依次从符号栈取出符号,然后从数栈取出两个数,运算后的结果,入数栈,直到符号栈为空

 

相关文章
|
11月前
|
算法 机器人
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
本课题研究基于海鸥优化算法(SOA)优化PID控制器参数的方法,通过MATLAB仿真对比传统PID控制效果。利用SOA算法优化PID的kp、ki、kd参数,以积分绝对误差(IAE)为适应度函数,提升系统响应速度与稳定性。仿真结果表明,SOA优化的PID控制器在阶跃响应和误差控制方面均优于传统方法,具有更快的收敛速度和更强的全局寻优能力,适用于复杂系统的参数整定。
|
算法 JavaScript 数据安全/隐私保护
基于GA遗传优化的最优阈值计算认知异构网络(CHN)能量检测算法matlab仿真
本内容介绍了一种基于GA遗传优化的阈值计算方法在认知异构网络(CHN)中的应用。通过Matlab2022a实现算法,完整代码含中文注释与操作视频。能量检测算法用于感知主用户信号,其性能依赖检测阈值。传统固定阈值方法易受噪声影响,而GA算法通过模拟生物进化,在复杂环境中自动优化阈值,提高频谱感知准确性,增强CHN的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
1202 77
|
编译器 C语言 C++
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
304 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
算法 数据安全/隐私保护
基于Big-Bang-Big-Crunch(BBBC)算法的目标函数最小值计算matlab仿真
该程序基于Big-Bang-Big-Crunch (BBBC)算法,在MATLAB2022A中实现目标函数最小值的计算与仿真。通过模拟宇宙大爆炸和大收缩过程,算法在解空间中搜索最优解。程序初始化随机解集,经过扩张和收缩阶段逐步逼近全局最优解,并记录每次迭代的最佳适应度。最终输出最佳解及其对应的目标函数最小值,并绘制收敛曲线展示优化过程。 核心代码实现了主循环、粒子位置更新、适应度评估及最优解更新等功能。程序运行后无水印,提供清晰的结果展示。
370 14
|
算法 调度 C++
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
412 11
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
10月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
804 0
|
10月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
505 2

热门文章

最新文章