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

  思路就

    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. window cmd 端口查进程
  2. 大学计算机基础课程报告python-Python程序设计习题解析(大学计算机基础教育规划教材)...
  3. html 按下和松开事件,JQuery通过键盘控制键盘按下与松开触发事件
  4. 【(Python解释器、Pycharm)安装教程】【使用PyCharm编写第一个Python程序】
  5. 辩论界人机大战:IBM 人工智能和人类辩手几乎平手
  6. java诺基亚nba,HMD 签约NBA 新秀劳里·马尔卡宁 为诺基亚手机品牌大使
  7. S. gcc相关软件安装
  8. 在Android 8.0之后版本上添加Hidl Service
  9. WinForm开发知识汇总
  10. win10需要开启系统打印机服务器,Win10系统开启和关闭打印机服务技巧
  11. FileUtils常用方法 - commons-io常用工具类
  12. 硬件工程师相关书籍整理
  13. Md5码的生成及变种Md5码的生成
  14. 幻方解法之horse法生成奇阶幻方
  15. php音乐相册怎么打开,手机如何制作相册 手机音乐相册的制作方法
  16. 高职单招计算机基础知识题,高职单招计算机基础练习题
  17. python扫描器_Python扫描器-HTTP协议
  18. SEVERE: Error configuring application listener of
  19. 《论语》原文及其全文翻译 学而篇9
  20. 浅析微信支付:开通社交立减金活动、创建立减金及领取使用的相关文档和源码

热门文章

  1. Java基础-方法(2)和数组
  2. Zabbix server is not running: the information displayed may not be current.
  3. Dos批处理中符号作用大全
  4. 听说你还没学Spring就被源码编译劝退了?30+张图带你玩转Spring编译
  5. 我的中年危机来得很自然
  6. jQuery-给ul添加了li之后,添加的li并没有绑定点击监听怎么办?
  7. android 组件不可见,Android setVisibility(View.VISIBLE)不显示该组件
  8. Java求n以内素数_求0到n之间素数个数的序列(Java)
  9. 单引号和冒号不能存入mysql么_mysql单引号和双引号的用法
  10. 英语作文 计算机新技术对生活的影响,急求一篇电脑对于未来生活影响的英语作文,50分 200词左右...