开发者学堂课程【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 := &stackf
MaxTop : 20,
Top : -1,
③ 第三步:索引就是定义一个 index 帮助扫描,初始化是从零开始扫描,做一个 for 循环,有一个 index 开始扫。
exp := "3+2*6- 2”
//定义一个 index ,帮助扫描 expindex := 0
for {
ch := exp[index:index+1] I
}
说明:字符串的本质就是切片来操作,返回的是单个字符的字符串,要根据刚逻辑来判断是一个数字还是一个运算符。
④第四步:判断一个字符是不是一个运算符。运算符这里面只做加减乘除。单个的字符在本质上其实就是一个整数。因此就直接用这个它对应的阿斯克码来判断他是不是一个整数。阿斯克码其实它的本质就是一个整数,所以利用这一点。
//判断一个字符是不是一个运算符[+, - , *, /]func (this *stack) Is0per(val int) bool
if val == 42 lI val == 43 || val == 45 ll val == 47{
return true
} else {
return false
)
说明:
这个阿斯克码不是连在一起的,一般来在四十二四十三跳过一个逗号。又跳过一个点号才是这个层。
⑤第五步:按顺序来加减乘除,紧接着来判断,case 如果是45的话,他是一个减法号,减法的顺序一定是 number2 减 number1,否则这个结果是错的。还有一个就是除法,Case 是47,那么 result 就应该等于 number2 除以 number1。如果这个运算符有问题,就直接提示运算符错误
//运算的方法func (this "stack) cal(nuins int, num2 int, oper int) int(
res := 0
switch oper
case 42
res . num2 *num1
case 43
res . num2 + num1
case 45
res . num2 - num1
case 47
res . num2 / num1
default:
fmt.Println("运算符错误")
}
return res
说明:如果 else 不是这个值,就返回 false。运算后,还得有一个方法,来判断那个优先级高那个优先级低。
⑥第六步:一个特别重要的方法就是优先级,认为乘法和除法它的优先级为一,加法和减法为零就可以了。小括号优先级更高,就把小括号的优先级定为二。编写一个方法返回某个运算符的优先级。这个优先级是程序员定的。
加法还有减法,它的优先级为零,只要保证这个乘法和除法优先级高于它就可以了。
优先级这个单词用的不太多,然后一个操作符就可以了,也是一个类型的,如果它等于一个除,除这个符号是47号,如果它等于47没问题,就返回它优先级为一。到最后一个就是 else,认为有错误对有 F,给他优先级一,另一个给他一个优先级为零。最后返回,如果将来还想设置一些小括号,大括号中括号,可以在这个基础上再增加。优先级就写完了。
//编写一个方法,返回某个运算符的优先级【程序员定义】//[*/ =>1+-=>0]
func (this *stack) Priority(oper int) int {
res := 0
if oper == 42 || oper == 47{
res =1
else if oper == 43 II oper == 45{
res =0
}
return res