相关过程截图







关键代码解释

  • 将运算式分开的代码
    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. 前端模块化小总结—commonJs,AMD,CMD, ES6 的Module

    随着前端快速发展,需要使用javascript处理越来越多的事情,不在局限页面的交互,项目的需求越来越多,更多的逻辑需要在前端完成,这时需要一种新的模式 --模块化编程 模块化的理解:模块化是一种处理 ...

  2. [异常笔记]启动DFS报错:Cannot find configuration directory: /etc/hadoop

    [hadoop@master ~]$ start-dfs.sh Incorrect configuration: namenode address dfs.namenode.servicerpc-ad ...

  3. 怎么将oracle的sql文件转换成mysql的sql文件

    怎么将sql文件导入PowerDesigner中的方法(将oracle的sql文件转换成mysql的sql文件)呢? 怎么将xx.sql文件的数据库结构导入powerdesigner 的方法呢? 现讲 ...

  4. 如何使用git命令从github上取得项目

    首先我们要安装git, git官网:https://git-scm.com/点击打开链接 拉取项目步骤详解 新建文件夹,最好取为项目英文名***Project 进入文件夹,空白处右键,选择git Ba ...

  5. Mysql慢查询开启和查看 ,存储过程批量插入1000万条记录进行慢查询测试

    首先登陆进入Mysql命令行  执行sql      show variables like 'slow_query%';  结果为OFF 说明还未开启慢查询 执行sql     show varia ...

  6. nginx 日志记录 自定义详解(分析上报用)

    nginx 日志记录 自定义详解   1.log_format 普通格式 log_format main '$remote_addr - $remote_user [$time_local] $req ...

  7. 一、PHP基础-安装PHP集成环境

    目录 PHP运行集成环境下载 phpStudy集成环境安装 XAMPP集成环境安装 WampServer环境安装 作者:吴耀田  个人博客:http://www.cnblogs.com/isaacwy ...

  8. C语言实现''student a am i''字符串的正确排列

    #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int Reverse(char a[ ...

  9. (转)service apache2 restart失败

    https://askubuntu.com/questions/431925/how-to-restart-apache2-when-i-get-a-pid-conflict sudo kill -9 ...

  10. 20145209刘一阳 《网络对抗》Exp7 网络欺诈技术防范

    20145209刘一阳 <网络对抗>Exp7 网络欺诈技术防范 一.应用SET工具建立冒名网站 要让冒名网站在别的主机上也能看到,需要开启本机的Apache服务,并且要将Apache服务的 ...