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

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

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

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


数据结构和算法_栈的计算表达式(2)


 内容介绍:

一.算法

二.流程演示

 

一.算法

1.创建两个栈,numstack,operstack

2.numstack 存放数,operstack 操作符

3.index;=0

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

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

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

① operstack 是一个空栈,直接入栈

②如果 operstack 不是一个空栈

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

2.2否则,运算符就直接入栈

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

 

二.流程演示

①第一步:建立一个新的文件夹叫 package main , stack 直接用。

package main

import(

"fmt"

func main() {

说明:可以直接用栈,可以将“1”改成“20”

②第二步:建立两个栈,一个是数栈还有一个是符号栈,数栈最多放20个数,top  初识值为负一,就做整数的运算,小数就不动。

func main() {
//数栈
numStack := &stackf

MaxTop : 20,

Top : -1,

//符合栈

operStack := &stackfMaxTop : 20,Top : -1,

③ 第三步:索引就是定义一个 index 帮助扫描,初始化是从零开始扫描,做一个 for 循环,有一个 index 开始扫。

exp := "3+2*6- 2”
//定义一个 index ,帮助扫描 exp
index := 0

for {

ch := exp[index:index+1] I

}

说明:字符串的本质就是切片来操作,返回的是单个字符的字符串,要根据刚逻辑来判断是一个数字还是一个运算符。

④第四步:判断一个字符是不是一个运算符。运算符这里面只做加减乘除。单个的字符在本质上其实就是一个整数。因此就直接用这个它对应的阿斯克码来判断他是不是一个整数。阿斯克码其实它的本质就是一个整数,所以利用这一点。

//判断一个字符是不是一个运算符[+, - , *, /]
func (this *stack) Is0per(val int) boolif val == 42 lI val == 43 || val == 45 ll val == 47{return true} else {return false)

image.png

说明:

这个阿斯克码不是连在一起的,一般来在四十二四十三跳过一个逗号。又跳过一个点号才是这个层。

⑤第五步:按顺序来加减乘除,紧接着来判断,case 如果是45的话,他是一个减法号,减法的顺序一定是 number2 减 number1,否则这个结果是错的。还有一个就是除法,Case 是47,那么 result 就应该等于 number2 除以 number1。如果这个运算符有问题,就直接提示运算符错误

//运算的方法
func (this "stack) cal(nuins int, num2 int, oper int) int(res := 0switch opercase 42res . num2 *num1case 43res . num2 + num1case 45res . num2 - num1case 47res . num2 / num1default:fmt.Println("运算符错误")return res

说明:如果 else 不是这个值,就返回 false。运算后,还得有一个方法,来判断那个优先级高那个优先级低。

⑥第六步:一个特别重要的方法就是优先级,认为乘法和除法它的优先级为一,加法和减法为零就可以了。小括号优先级更高,就把小括号的优先级定为二。编写一个方法返回某个运算符的优先级。这个优先级是程序员定的。

加法还有减法,它的优先级为零,只要保证这个乘法和除法优先级高于它就可以了。

优先级这个单词用的不太多,然后一个操作符就可以了,也是一个类型的,如果它等于一个除,除这个符号是47号,如果它等于47没问题,就返回它优先级为一。到最后一个就是 else,认为有错误对有 F,给他优先级一,另一个给他一个优先级为零。最后返回,如果将来还想设置一些小括号,大括号中括号,可以在这个基础上再增加。优先级就写完了。

//编写一个方法,返回某个运算符的优先级【程序员定义】
//[*/ =>1+-=>0]func (this *stack) Priority(oper int) int {res := 0if oper == 42  || oper == 47{res =1else if oper == 43 II oper == 45{res =0return res

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

热门文章

最新文章