相关过程截图







关键代码解释

  • 将运算式分开的代码
    String[] result = num.split("\\s");
    将输入的num以空格为间隔符号分开,将每一个间隔开的字符存入一个名为result的数组里。
  • if ("+".equals(a) || "-".equals(a)) { if ("+".equals(b) || "-".equals(b) || ")".equals(b) || "#".equals(b)) { c = OPTR.pop(); z = OPND.pop(); y = OPND.pop(); //str += " "; str += y; str += " "; str += z; str += " "; str += c; str += " "; OPND.push(str); str = ""; if ("(".equals(OPTR.peek()) && ")".equals(result[x])){ OPTR.pop(); }
    这里给出了一个当a(栈顶元素)的优先级大于b(输入运算符)的情况,将运算符栈的栈顶和操作数栈头两个数提出,重新拼接成一个新的整体的字符存入操作数栈,再将式子的值清空(防止新的式子加在曾经的式子后面),将当前运算符压入运算符栈,但当a匹配b时就直接将栈顶元素a剔除掉(防止转为后缀后依然带有“(”“)”号)。(这里基本实现了当a > b时,a出栈,从OPND依次弹出两个操作数y,x,z = x y a,并将a压入栈OPND,c压进OPTR的操作)

  • if ("=".equals(result[x])) { while (OPND.size() != 0) { number.push(OPND.pop()); } suf += " "; suf += number.pop(); while (number.size() != 0){ suf += " "; suf += number.pop(); } while (OPTR.peek() != "#"){ suf += " "; suf += OPTR.pop(); } suf += " "; suf += "="; } }
    这里我将“=”设为了一个终止的标志,当程序识别到“=”号时,程序将两个栈里的元素进行清理,最终拼接成后缀式。在该程序里,我将操作数栈里的元素重新压入进一个新的栈里,这样就颠倒了栈里元素的顺序,方便之后的拼接。

遇到的困难及解决方法

  • 1:最开始的思路不是特别清晰,没有把老师上课提供的方法领悟,几乎是在凭自己的思路在编写。一开始的思路是,逐步编辑,先编写出只能转换纯加减号或纯乘除号的式子,再在此基础之上拓展为加减乘除混合运算的式子并实现转换,最后再加上括号,我想实现三步走的计划。
  • Q:如何将输入的式子的每一项分开成为一个单独的字符,尤其是x/y型的分数,如何能使程序将包含三个元素的分数归为一个又不影响其他只含一个元素的字符?
  • A:String下有一个split方法,它可以将指定字符作为分隔标记,且将分隔开的字符存入一个数组里面,在这里我就可以使用空格作为分隔标记,而真分数的数与运算符之间不用空格进行间隔,这样就可以实现了。

  • Q:进行纯的加减或是纯的乘除的运算的思路比较简单,就相当于将原式子的操作数和运算符分别抽离,再进行重新拼接的过程,这也算是给后面挖了一个很大的坑吧,也就是说升级进行加减乘除混合运算的代码实现时,因为运算符的相对位置的不同,转后缀的过程如果单纯有编码者自己去预料到所有情况显然是有些困难的,所以我在这里编写了极其极其冗杂的if-else语句来判断情况进行拼接。附一张只能进行纯加减运算的转后缀

  • A:当时我想到的解决方案是,如果是这样的一串运算式1 + 2 * 3 - 4/5,那就先通过一个方法,将用乘除号连接的式子用一个新的字符b来表示,那之后的运算式就转换为1 + b - 4/5这样再调用第一步的纯加减运算,就可以解决了。
  • Q:但如上给出的解决方案看似可行实际上依然难以实现,因为依然要考虑运算符的前一个和后一个运算符的情况,比如我想当遇到第一个乘号或者除号时,用substring方法将一整串式子提出,但是遇到后一个乘号或是除号时,进行大量的判断,所以整个代码依然是特别浩繁的。
  • A:经过组员的提醒,我才重新看了一遍老师的讲课,发现其在PPT中给出了清晰的思路,所以之前算是给自己交的学费吧。

  • 2
  • Q:如何建立运算符的优先级?
  • A:最开始我想编写一个Compare类,在类中定义好所有运算符的优先级关系,在转后缀时,判断栈顶元素和当前输入运算符的关系,输出“<”,“>”,“=”(因为题目生成时不会有错误,所以就没有再考虑错误的情况)。而大于小于等于的关系我想用封装器将栈顶元素和输入运算符赋为int值0和1,这样比较起来就比较容易,但是最后实行起来貌似比较困难,然后我又想到第五章的编程项目PP5—7“剪刀石头布”的编写似乎和这个的比较有相似之处,然后翻阅之前的代码,明确了一个思路,不再单独编写一个类来实现,直接使用if-else语句把所有情况罗列(没错,感觉又一步一步地朝着最开始的思路在行进了。)其他关于这部分的问题在关键代码的解释中有了解释。

写出项目中自己负责的部分

实现中缀表达式转为后缀表达式

个人贡献度划分(按百分比给小组各成员划分贡献度,各成员贡献之和为100%)

方艺雯 谭鑫 王禹涵
贡献度 33.4% 33.3% 33.3%

对结对的小伙伴做出评价给出小伙伴博客链接(重点指出需要改进的地方)

  • 20172305代码编写认真且有开阔的视野,能够不拘泥于固定的思维。
  • 20172314代码编写非常的认真,遇到问题也很努力的在想办法解决。

    给出项目的码云链接

    给出小组结对编程照片

2017-2018-2 20172323 『Java程序设计』课程 结对编程练习_四则运算 2的更多相关文章

  1. 2017-2018-2 20172323 『Java程序设计』课程 结对编程练习_四则运算

    结对编程的好丽友 - 20172323 王禹涵:中缀转后缀 - 20172314 方艺雯:后缀表达式的计算 - 20172305 谭鑫:中缀表达式的输出 需求分析 能随机生成由使用者确定的任意多道四则 ...

  2. 2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算

    2017-2018-2 165X 『Java程序设计』课程 结对编程练习_四则运算 经过第一阶段的学习,同学们已经熟悉了这门语言基本的用法.在一次又一次对着电脑编写并提交代码,进行练习的时候,有没有觉 ...

  3. 2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周

    2017-2018-2 20172310『Java程序设计』课程 结对编程练习_四则运算_第二周 博客要求 组内同学需各自发表博客 博客中需包含以下内容: 相关过程截图 关键代码解释 遇到的困难及解决 ...

  4. 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算_第三周

    2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算 组队成员: 仇夏 学号: 20172310 博客地址: @王志伟 四则运算第一周博客 @仇夏四则运算第一周博客 ...

  5. 2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算——第一周

    2017-2018-20172309 『Java程序设计』课程 结对编程练习_四则运算 组队成员: 仇夏 学号: 20172310 博客地址:点击这里 1. 需求分析: 可生成题目: - 输入要想生成 ...

  6. 2017-2018-2 20165225『Java程序设计』课程 结对编程练习_四则运算

    2017-2018-2 20165225『Java程序设计』课程 结对编程练习_四则运算 需求分析: 支持整数,可进行多运算符运算,有优先级. 设计思路: 在有括号的情况下,先计算得出括号中的结果,如 ...

  7. 20172325『Java程序设计』课程 结对编程练习_四则运算第三周阶段总结

    20172325『Java程序设计』课程 结对编程练习_四则运算第三周阶段总结 结对伙伴 学号:20172306 姓名:刘辰 在这次项目的完成过程中刘辰同学付出了很多,在代码的实践上完成的很出色,在技 ...

  8. 20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第一周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址: http://www.cnblogs.com/ ...

  9. 20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结

    20172311『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号 :20172307 姓名 :黄宇瑭 伙伴第一周博客地址 对结对伙伴的评价:黄宇瑭同学的优势在于能够想出一 ...

随机推荐

  1. LAMP+Varnish的实现

    基于Keepalived+Varnish+Nginx实现的高可用LAMP架构 注意:各节点的时间需要同步(ntpdate ntp1.aliyun.com),关闭firewalld(systemctl ...

  2. Java 8 – Map排序

    前提 Map是Java中最常用的集合类之一,这里整理了关于HashMap的排序 (关于List的排序,请查看Collections.sort()的doc或源码). 将无序的HashMap借助Strea ...

  3. 解决 ajax 跨域

    用两个服务器处理一个项目的代码,其中一台服务器只处理接口请求. 本来PHP可以使用CURL来处理,但是领导不允许使用PHP来处理数据.会影响网站的功能.如果接口端出现问题会导致整个网站或其页面的崩溃, ...

  4. H5混合开发进阶之inspect调试

    h5界面嵌套在原生app内部的时候,需要调用原生的方法,传递数据.中间难以调试代码,. 用google的 inspect调试.查看数据的传输方式. 1.adb连接正常,打开手机USB调试 2.第一次使 ...

  5. Kibana6.3.1安装

    Kibana安装 Kibana官方下载地址: https://www.elastic.co/cn/downloads/kibana 也可以直接使用以下命令下载(文章下载目录一概为/home/tools ...

  6. 树莓派3B+学习笔记:2、更改显示分辨率

    1.打开终端,输入 sudo raspi-config 选择第7行: 2.选择第5行: 3.选择一个自己习惯的分辨率(我选择1024X768),确定后重启,VNC会自动连接: 4.更改分辨率完成,方便 ...

  7. MySQL集群-PXC搭建以及使用innobackupex工具进行全局备份和增量备份

    环境:centos7 vm1:10.154.47.236 vm2:10.154.52.189 vm3:10.105.12.50 目的:pxc使用三个节点构建mysql集群,使用innobackupex ...

  8. Simple, Poetic, Pithy

    源自:Rob Pike points out Simple, Poetic, Pithy Don't communicate by sharing memory, share memory by co ...

  9. vim 粘贴文本,格式混乱 tab

    粘贴的代码如上.修改方法: 方法一: set paste 贴完后,设置 set nopaste 恢复代码缩进. 方法二:修改配置文件 vim /etc/vim/vimrc set pastetoggl ...

  10. Java两个线程实现交替运行-以交替打印奇偶数为例

    本文旨在两个线程交替运行,不多哔哔直接看代码吧 public class Work2 { static final Object object = new Object(); public stati ...