数据结构和算法_栈的计算表达式(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

相关文章
|
16天前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
27 1
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
26 1
|
17天前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
17天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
25天前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
86 23
|
25天前
|
算法
数据结构之蜜蜂算法
蜜蜂算法是一种受蜜蜂觅食行为启发的优化算法,通过模拟蜜蜂的群体智能来解决优化问题。本文介绍了蜜蜂算法的基本原理、数据结构设计、核心代码实现及算法优缺点。算法通过迭代更新蜜蜂位置,逐步优化适应度,最终找到问题的最优解。代码实现了单链表结构,用于管理蜜蜂节点,并通过适应度计算、节点移动等操作实现算法的核心功能。蜜蜂算法具有全局寻优能力强、参数设置简单等优点,但也存在对初始化参数敏感、计算复杂度高等缺点。
57 20
|
17天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
38 5
|
1月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
25天前
|
机器学习/深度学习 算法 C++
数据结构之鲸鱼算法
鲸鱼算法(Whale Optimization Algorithm,WOA)是由伊朗研究员Seyedali Mirjalili于2016年提出的一种基于群体智能的全局优化算法,灵感源自鲸鱼捕食时的群体协作行为。该算法通过模拟鲸鱼的围捕猎物和喷出气泡网的行为,结合全局搜索和局部搜索策略,有效解决了复杂问题的优化需求。其应用广泛,涵盖函数优化、机器学习、图像处理等领域。鲸鱼算法以其简单直观的特点,成为初学者友好型的优化工具,但同时也存在参数敏感、可能陷入局部最优等问题。提供的C++代码示例展示了算法的基本实现和运行过程。
44 0
|
1月前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。