开发者学堂课程【Go 语言核心编程 - 数据结构和算法:数据结构和算法—栈的计算表达式(3)(二)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/627/detail/9858
数据结构和算法—栈的计算表达式(3)(二)
二、最终逻辑
以上全部内容就处理完了 for 循环,上述逻辑分析完后,还存在最后一个逻辑:
如果扫描表达式完毕,依次从符号栈取出符号,然后从数栈取出两个数,运算后的结果,入数栈,直到符号栈为空
在 for 循环下输入代码:
for{
if operStack.Top == -1 {
//做一个判断,符号位的 top=-1说明栈已经空了
break //退出条件
}
//如果没有空,再运行一遍如下代码。并且现在符号栈只有取没有压的过程
num1,_ = numStack.Pop()
num2,_ = numStack.Pop()
oper,_ = operStack.Pop()
result = operStack.Cal(num1,num2,oper)
//将计算结果重新入栈
numStack.Push(result)
}
最后当它退出来的时候,如果我们的算法没有问题,栈没有问题,表达式也是正确的,结果就是 numStack 最后得数
现在将结果弹出来,
输入代码
res,_ :=
num
S
tack.
pop()
fmt.Printf(
“
表达式%s=%v
”
,exp,res)
然后来尝试运行,在 cmd 中输入
cd..
dir
cd expStack
dir
go_run main.go
结果显示3+2*6-2=2701
说明代码还是不正确
发现 numStack.Push(temp)中的数存在问题,应该将 for 循环中的 ch 转换成整数
代码 numStack.Push(temp)相当于如果压入3,压入的其实是3对应的 ASCII 码,相当于是51
接下来来修改代码,在代码numStack.Push(temp)
上添加val,_
:=strconv.ParseInt(ch,10,64)
//会返回一个 error,不做处理
接收到 strconv 后还需要引入该包 import”strconv”
之后再来压入,修改 numStack.Push(temp)为numStack.Push(int(val))
之后再来进行运行,查看效果,结果显示3+2*6-2 = 13
为了证明它的准确性,再来改变一下值,将原代码中的exp :=”3+2*6-2”改为exp :=”3+3*6-4”
再来查看结果,结果显示3+3*6-4 = 17结果正确
结果正确后,思考一个问题:
比如将 exp :=
”
3+3*6-4
”
改为 exp :=
”
30+3*6-4
”
就会整体出错。因为在 for中没有进行任何处理,会将30当作一个数字,而0不会处理。
这时再来查看结果,结果显示30+3*6-4 = 14