之前在学习栈的时候老师讲过这个问题

  思路就

    1.将表达式(中缀式)转化成后缀式;

    2.进行后缀式的计算。

  思路看起来很简单,但是实际在敲代码的时候还是要注意很多问题。下面分享一下个人做法,可以改进之处还希望大家可以指出来,共同进步!

  一:将中缀式转化为后缀式

  个人采用的是边输入边进行处理:首先设置两个栈,一个是后缀式栈,一个是符号栈。如果是数字,直接放入到后缀式栈中;如果是符号:

  (1)比较算符优先级,如果符号栈的栈顶符号比将要进栈的符号优先级高,那么将符号栈的栈顶元素弹出,进入到后缀式栈中,接着进行栈顶元素和待进栈元素的比较,直到栈顶元素优先级比待进栈符号优先级低。如果符号栈的栈顶符号优先级低,则将将要进栈的符号压入到符号栈中,称为新的栈顶元素。以上涉及到了:算符优先级的比较,实现代码如下:

紫框详解:我们知道,‘(’的优先级是最高的,那么如果它作为栈顶元素与其他符号比较之后,会被弹出到后缀式栈。然而我们后缀式栈不希望有括号的出现,而符号栈希望括号可以保留,因为我们需要找到后面的‘)’与左括号进行配对。所以这里需要约定,如果栈顶元素是左括号,那么下一个符号直接进栈不进行比较。

  以上是我们后缀式转化的代码。在suffix函数(转化成后缀式)中,我们是边输入边处理,如果是数字,直接进栈,调用isNum函数;如果是符号,调用isSymbol函数。

  在isSymbol函数中,我们做的不仅仅是优先级的判断,因为有括号这个特殊的符号存在,所以我们需要给予特殊考虑。在遇到右括号的时候,我们应该将符号栈中的元素弹出,直到遇到左括号,但是左括号不弹入到后缀式栈中。

  如果不是右括号,我们就判断优先级,但是在这之前,还需要做的一步就是设置分界符,我们这里使用的是'#'号。为什么设置分界符呢?我们知道,读入表达式的时候使用的是char型,一个一个读的,这样产生的问题是,如果数字是10以内的,没有影响,但是如果大于等于10,则会分成多部分读入,例如23读进来是2,3,在不同的数组单元中,那么操作数字的时候就不知道到底是一位数还是两位数,所以我们需要‘#’号,后缀式的形式就成了:1#23#4#+......这样子的,很容易区分操作数是几位。

  我第一次做的时候,忽略了一个问题:就是将符号栈的剩余元素全部压入到后缀式栈中。因为在优先级比较之后,很多符号可能因为在操作顺序中靠后,所以并没有进入到后缀式中,因此千万不能忘了他们的存在。

  到这里,我们的后缀式转换就完成了。工程相当于完成了一半,接下来就应该是后缀式的计算:

  前面说到过了,我们后缀式中通过'#'号对数字进行了区分,那么我们进行计算的时候,先要把操作数准确的计算出来,放入到数字栈(num[])中。

红框详解:对于转之后的后缀式,计算操作数我想到的办法是设置一个first和last指针,在first和last之间的是一个操作数,那么区分的标志就是,两个操作数之间一定有若干个符号。

大家再对照着代码,应该可以理解(可能这里我的方法比较麻烦,希望大家可以指点一二)

下面我们就开始进行计算了:

这里还是比较简单的,遇到数字就调用cul_num函数,进行数字的计算,遇到符号就进行符号运算。这里需要注意的就是我们first和last的设置。此外,还应该考虑一下特殊的情况,我当时出现的一个问题就是:

例如:1#2#3-#4...进行到‘-’减号的时候程序就崩掉了,后来想想明白了问题所在,当last指向减号的时候,执行减法功能,然后i++,那么这个时候,指向的是后缀式栈中的‘#‘号,而在calculate函数中,没有对#的相关处理,所以程序崩了。分析得到:我们并不需要#,所以再i++,指向后缀式栈中的下一个元素。这就是我上面代码注释的“忽略了”这里的含义。

(本人第一次写博客,不到之处还希望大家批评指正,我会继续努力!共勉!)

蓝桥杯_算法训练_表达式计算相关推荐

  1. 蓝桥杯 ALGO-92 算法训练 前缀表达式

    问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值. 输入格式为:"运算符 对象1 对象2",其中,运算符为"+"(加法)."-& ...

  2. 蓝桥杯:算法训练 印章 Python

    问题描述 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入格式 一行两个正整数n和m 输出格式 一个实数P表示答案,保留4位小数. 样例输入 2 3 样例 ...

  3. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  4. 蓝桥杯 试题 算法训练 无聊的逗 C++ 详解 - 未完善

    题目: 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的 ...

  5. 蓝桥杯 试题 算法训练 筛选号码 Java

    蓝桥杯 试题 算法训练 筛选号码Java 算法训练 筛选号码 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 有n个人围成一圈,顺序排号(编号为1到n).从第1个人开始报数(从1到3 ...

  6. 算法刷题系列(四)蓝桥杯python算法训练3(下)

    上一次的节点选择算法由于春节过年耽搁了,现在重新补上 上篇链接:算法刷题系列(四)蓝桥杯python算法训练3 - 经验教训 在纷繁复杂的使用了列表来暂存数据之后,发现其实可以利用笔者自己不太常用的字 ...

  7. 蓝桥杯 试题 算法训练 无聊的逗

    蓝桥杯 试题 算法训练 无聊的逗 问题描述 逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中.不过他想到了一个游戏来使他更无聊.他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘 ...

  8. 蓝桥杯试题 算法训练 绘制地图

    蓝桥杯试题 算法训练 绘制地图 问题描述 最近,WYF正准备参观他的点卡工厂.WYF集团的经理氰垃圾需要帮助WYF设计参"观"路线.现在,氰垃圾知道一下几件事情: 1.WYF的点卡 ...

  9. 蓝桥杯 试题 算法训练 娜神平衡 C++ 详解

    问题描述: 娜娜是一个特别可爱的女孩子,作为学神的她最近在情感方面出现了一点点小问题. 她暗恋的琦琦是一名学霸,他只喜欢长得漂亮和学习很好的女生. 娜娜学习确实很神,但是她在琦琦面前却总是表现不出平时 ...

  10. 蓝桥杯 试题 算法训练 24点 C++ 详解

    问题描述: 24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加.减.乘.除以及括号想办法得到24 ...

最新文章

  1. 解决win7不能上网的问题
  2. HDU 3709 Balanced Number
  3. 波卡链Substrate (7)Grandpa协议四“责任安全机制”
  4. JAVA实现美团电影价格抓取(附代码)
  5. 阿里动物园新成员来了,10本书带你读懂这个新物种
  6. 关于区块链的一些思绪
  7. Bailian4104 单词翻转(POJ NOI0107-27)【堆栈+字符流】
  8. 潜意识的力量:潜意识开发四大关键
  9. Leetcode之路径总和II
  10. NOD 32 企业版远程管理服务器病毒库更新失败_七夕小子_新浪博客
  11. 如何在python中输入复杂的数学公式_如何快速输入复杂的数学公式?这里有 3 个实用技巧...
  12. 我的世界刷猪人塔java版_我的世界猪人塔怎么做 5款猪人塔详解教程
  13. 从 0 开始学游戏开发
  14. APP开发接入广告平台及应用市场(应用分发平台)记录
  15. 中国足球有救了,因为这两个人已经成为中超新时代教练的一股清流
  16. 计算机组成原理相关知识重要吗?
  17. 【树的算法】之求分割木板最小开销
  18. python 期货交易接口_期货数据接口(期货数据接口 python)
  19. 2023年我终于进阿里了,阿里offer五面经验与总结
  20. 莫烦Python NumpyPandas 学习笔记

热门文章

  1. Mac003--Maven安装与环境变量配置
  2. HDU 4944 逆序数对
  3. 资源利用率监控与存储卷(pv/pvc)
  4. ASP保存远程图片到本地 同时取得第一张图片
  5. WCF与 Web Service的区别
  6. 传说中的CAFEBABE到底在哪儿?
  7. 终于弄明白 i = i++和 i = ++i 的区别了!
  8. Java Arrays.asList注意事项
  9. 看完这篇文章你还敢说你懂JVM吗?
  10. 从Java程序员的角度理解加密的那些事