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

目录
打赏
0
0
0
0
55
分享
相关文章
基于GA遗传优化的最优阈值计算认知异构网络(CHN)能量检测算法matlab仿真
本内容介绍了一种基于GA遗传优化的阈值计算方法在认知异构网络(CHN)中的应用。通过Matlab2022a实现算法,完整代码含中文注释与操作视频。能量检测算法用于感知主用户信号,其性能依赖检测阈值。传统固定阈值方法易受噪声影响,而GA算法通过模拟生物进化,在复杂环境中自动优化阈值,提高频谱感知准确性,增强CHN的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
栈区的非法访问导致的死循环(x64)
这段内容主要分析了一段C语言代码在VS2022中形成死循环的原因,涉及栈区内存布局和数组越界问题。代码中`arr[15]`越界访问,修改了变量`i`的值,导致`for`循环条件始终为真,形成死循环。原因是VS2022栈区从低地址到高地址分配内存,`arr`数组与`i`相邻,`arr[15]`恰好覆盖`i`的地址。而在VS2019中,栈区先分配高地址再分配低地址,因此相同代码表现不同。这说明编译器对栈区内存分配顺序的实现差异会导致程序行为不一致,需避免数组越界以确保代码健壮性。
21 0
栈区的非法访问导致的死循环(x64)
232.用栈实现队列,225. 用队列实现栈
在232题中,通过两个栈(`stIn`和`stOut`)模拟队列的先入先出(FIFO)行为。`push`操作将元素压入`stIn`,`pop`和`peek`操作则通过将`stIn`的元素转移到`stOut`来实现队列的顺序访问。 225题则是利用单个队列(`que`)模拟栈的后入先出(LIFO)特性。通过多次调整队列头部元素的位置,确保弹出顺序符合栈的要求。`top`操作直接返回队列尾部元素,`empty`判断队列是否为空。 两题均仅使用基础数据结构操作,展示了栈与队列之间的转换逻辑。
|
6月前
|
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
299 77
基于Big-Bang-Big-Crunch(BBBC)算法的目标函数最小值计算matlab仿真
该程序基于Big-Bang-Big-Crunch (BBBC)算法,在MATLAB2022A中实现目标函数最小值的计算与仿真。通过模拟宇宙大爆炸和大收缩过程,算法在解空间中搜索最优解。程序初始化随机解集,经过扩张和收缩阶段逐步逼近全局最优解,并记录每次迭代的最佳适应度。最终输出最佳解及其对应的目标函数最小值,并绘制收敛曲线展示优化过程。 核心代码实现了主循环、粒子位置更新、适应度评估及最优解更新等功能。程序运行后无水印,提供清晰的结果展示。
107 14
|
5月前
|
STL——栈和队列和优先队列
通过以上对栈、队列和优先队列的详细解释和示例,希望能帮助读者更好地理解和应用这些重要的数据结构。
77 11
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
6月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
158 7
基于WOA鲸鱼优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB 2022a/2024b实现,采用WOA优化的BiLSTM算法进行序列预测。核心代码包含完整中文注释与操作视频,展示从参数优化到模型训练、预测的全流程。BiLSTM通过前向与后向LSTM结合,有效捕捉序列前后文信息,解决传统RNN梯度消失问题。WOA优化超参数(如学习率、隐藏层神经元数),提升模型性能,避免局部最优解。附有运行效果图预览,最终输出预测值与实际值对比,RMSE评估精度。适合研究时序数据分析与深度学习优化的开发者参考。
基于PSO粒子群优化的BiLSTM双向长短期记忆网络序列预测算法matlab仿真,对比BiLSTM和LSTM
本项目基于MATLAB2022a/2024b开发,结合粒子群优化(PSO)算法与双向长短期记忆网络(BiLSTM),用于优化序列预测任务中的模型参数。核心代码包含详细中文注释及操作视频,涵盖遗传算法优化过程、BiLSTM网络构建、训练及预测分析。通过PSO优化BiLSTM的超参数(如学习率、隐藏层神经元数等),显著提升模型捕捉长期依赖关系和上下文信息的能力,适用于气象、交通流量等场景。附有运行效果图预览,展示适应度值、RMSE变化及预测结果对比,验证方法有效性。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问