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

 

相关文章
|
5月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
176 1
|
5月前
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
175 0
|
9月前
|
存储 算法 Java
算法系列之数据结构-二叉树
树是一种重要的非线性数据结构,广泛应用于各种算法和应用中。本文介绍了树的基本概念、常见类型(如二叉树、满二叉树、完全二叉树、平衡二叉树、B树等)及其在Java中的实现。通过递归方法实现了二叉树的前序、中序、后序和层次遍历,并展示了具体的代码示例和运行结果。掌握树结构有助于提高编程能力,优化算法设计。
310 10
 算法系列之数据结构-二叉树
|
9月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
266 3
 算法系列之数据结构-Huffman树
|
9月前
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
391 22
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
276 0
|
2月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
210 2
|
3月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
226 3
|
2月前
|
机器学习/深度学习 算法 机器人
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
使用哈里斯角Harris和SIFT算法来实现局部特征匹配(Matlab代码实现)
179 8
|
2月前
|
机器学习/深度学习 算法 自动驾驶
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
基于导向滤波的暗通道去雾算法在灰度与彩色图像可见度复原中的研究(Matlab代码实现)
189 8

热门文章

最新文章