当前位置:首页>编程日记>正文

【编程题】简单的四则运算

问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注: 1、表达式只含 +, -, *, /, (, ), 四则运算符
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
• 要求实现函数: 
int calculate(int len,char *expStr)
【输入】 int len: 字符串长度;
char *expStr: 表达式字符串;
【输出】 无
【返回】 计算结果

• 示例 
1) 输入:char *expStr = “1+4*5-8/3”
函数返回:19
2) 输入:char *expStr = “8/3*3”
函数返回:6 

  1 package MyTest;
  2 
  3 /**
  4  * 简单的四则运算,每个参与运算的数字都在0-9之间。
  5  */
  6 
  7 import java.util.*;
  8 
  9 public class FourOps {
 10 
 11     public static void main(String[] args) {
 12         Scanner in = new Scanner(System.in);
 13         while(in.hasNext()){
 14             String expretion = in.next();
 15             int length = expretion.length();
 16             int result = compute(length, expretion);
 17             System.out.println(result);
 18         }
 19 
 20     }
 21     
 22     /**
 23      * 该函数有两个功能
 24      * 1. 首先把一个正常的中缀表达式,转化为一个后缀表达式
 25      * 2. 通过后缀表达式计算表达式的值
 26      * @param length
 27      * @param expretion
 28      * @return
 29      */
 30     private static int compute(int length, String expretion) {
 31         int result = 0;
 32         List<Character> oneOps = new LinkedList<>();
 33         oneOps.add('+');
 34         oneOps.add('-');
 35         List<Character> twoOps = new LinkedList<>();
 36         twoOps.add('*');
 37         twoOps.add('/');
 38         LinkedList<Character> ops = new LinkedList<>(); //用作栈,前面一定也要是LinkedList
 39         StringBuffer changedExp = new StringBuffer();
 40         for(int i = 0; i < length; i++){
 41             Character temp = expretion.charAt(i);
 42             if(temp >= '0' && temp <= '9')
 43                 changedExp.append(temp);
 44             else{
 45                 if(ops.isEmpty())
 46                     ops.push(temp);
 47                 else{
 48                     if(temp == '(')
 49                         ops.push(temp);
 50                     else{
 51                         if(oneOps.contains(temp)){
 52 //                            if(ops.peek() != '(')
 53                             //原来用的if,考虑在遇到+-的时候应该把栈里的运算符都pop出来,现在改用while
 54                             while(!ops.isEmpty()){
 55                                 if(ops.peek() == '(')
 56                                     break;
 57                                 changedExp.append(ops.pop());
 58                             }                                    
 59                             ops.push(temp);
 60                         }
 61                         else if(twoOps.contains(temp) && twoOps.contains(ops.peek())){    //为了连续的/法
 62                             changedExp.append(ops.pop());
 63                             ops.push(temp);
 64                         }
 65                         else if(temp != ')'){
 66                             ops.push(temp);
 67                         }
 68                         else{    //')'的情况
 69                             while(ops.peek() != '('){
 70                                 changedExp.append(ops.pop());
 71                             }
 72                             ops.pop();
 73                         }
 74                     }
 75                 }
 76             }
 77         }
 78         while(!ops.isEmpty()){
 79             changedExp.append(ops.pop());
 80         }
 81         String changedExpStr = changedExp.toString();
 82         System.out.println(changedExpStr);    //输出转化后的后缀表达式
 83         
 84         //用后缀表达式计算
 85         LinkedList<Integer> nums = new LinkedList<>();
 86         for(int i = 0; i < changedExpStr.length(); i++){
 87             Character temp = changedExpStr.charAt(i);
 88             if(temp >= '0' && temp <= '9'){
 89                 nums.push(temp-'0');
 90             }
 91             else{
 92                 int a = nums.pop();
 93                 int b = nums.pop();
 94                 switch(temp){
 95                 case '+': nums.push(a+b); break;
 96                 case '-': nums.push(b-a); break;
 97                 case '*': nums.push(a*b); break;
 98                 case '/': nums.push(b/a); break;
 99                 }
100             }
101         }
102         result = nums.pop();
103         return result;
104     }
105 
106 }

http://www.coolblog.cn/news/679626d689cd9664.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • 2019-9
  • jquery 使用小技巧
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • js常用阻止冒泡事件
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • 【设计模式】 模式PK:策略模式VS状态模式
  • JS实现-页面数据无限加载
  • CSS小技巧——CSS滚动条美化
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里巴巴分布式服务框架 Dubbo
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 两张超级大表join优化
  • Arm芯片的新革命在缓缓上演
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 通过Spark进行ALS离线和Stream实时推荐
  • 行为模式之Template Method模式