蓝桥杯 算法训练 ALGO-156 表达式计算
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder expression = new StringBuilder("("+br.readLine()+")"); //表达式,在输入的表达式两边加上括号
StringBuilder temp = new StringBuilder(); //存放临时表达式,即每次存放的都是任意一个括号中的子表达式
while(true){
int frontBrackets = expression.lastIndexOf("("); //从表达式后边开始搜索,找到最后一个"("
int backBrackets = expression.indexOf(")", frontBrackets); //从最后一个"("的位置开始往后搜索,找到与之对应的")" if(frontBrackets == -1) break; //若再无表达式需要计算,即expression只有一个整数时,跳出循环 temp.append(expression.substring(frontBrackets + 1 , backBrackets)); //将此括号中的表达式存入temp
expression.delete(frontBrackets, backBrackets + 1); //在原始表达式中将括号连同其中的表达式删除 for(int i = 0; i < temp.length(); i++){ //从子表达式中找出运算符,根据运算原则,先乘除后加减
if(temp.charAt(i) == '*'){ //若找到 "*" ,调用calculation进行运算
calculation(temp , '*' , i);
i = 0; //运算完后,i清零,方便下一次从开始位置继续寻找乘除运算符
} if(temp.charAt(i) == '/'){
calculation(temp , '/' , i);
i = 0;
}
} for(int i = 0; i < temp.length(); i++){ //找完乘除运算符后,开始找加减云算符
if(temp.charAt(i) == '+'){
calculation(temp , '+' , i);
i = 0;
} if(temp.charAt(i) == '-'){
calculation(temp , '-' , i);
i = 0;
}
} expression.insert(frontBrackets, temp); //运算完后,将结果插入在刚才删除的括号位置,构成新的表达式,继续循环计算
temp.delete(0, temp.length()); //将temp清空,方便下一个表达式计算 } System.out.println(expression); //输出结果
} /**
* 计算表达式
* @param src 表达式
* @param op 操作符
* @param location 操作符在表达式中的位置
*/
private static void calculation(StringBuilder src, char op, int location) {
int x = 0; //操作数1
int y = 0; //操作数2
int sum = 0;// sum = x (op) y String check = "0123456789+-"; //检测运算符两边的内容是否为其中数组或者正数或负数
StringBuilder temp = new StringBuilder(); //存放运算符两边的字符 if(location == 0) return; //若遇到子表示其中只有加减运算符这种情况,且遇到的第一个运算符其实是想表示一个正数或者负数的符号,则函数返回,继续寻找下一个运算符 int k = 0; //搜索操作符左右两边的数
for(k = location - 1; k >= 0 && check.contains(src.charAt(k) + ""); k--){ //从运算符左边一个位置开始往前搜索,找到第一个操作数
try{
//若数字前边有两个运算符,第一个是为了与前边的数相连,第二个是为了表示这个数的正负,则跳出循环,执行后面的语句
//比如: 5+(7+-5*+10),搜索到5前边时,先搜索到"-",发现前边还有一个"+",此时temp中没有运算符,则继续执行,当搜索到"+"时,发现前边没有运算符了,就跳出循环
if((src.charAt(k) == '+' || src.charAt(k) == '-') && (src.charAt(k-1) != '+' || src.charAt(k-1) != '-' ))
break;
if(temp.charAt(0) == '+' || temp.charAt(0) == '-')
break; }catch(Exception e){
// e.printStackTrace(); //不输出异常,满足题目输出要求
} temp.insert(0, src.charAt(k)); //每次都是从temp的开始位置插入内容,保证逆向搜索的内容能按照正常的顺序存入temp
src.deleteCharAt(k); //删除运算符前边的那个数字,若有正负号,也一并删除
} x = Integer.parseInt(temp.toString()); //将搜索到的此数存入x
temp.delete(0, temp.length()); //将temp清空 for(k = k + 2; k < src.length() && check.contains(src.charAt(k) + ""); ){ //从运算符右边一个位置开始往后搜索,找到第二个操作数,加2是因为上边的循环语句在结束时自减了一次 if((src.charAt(k) == '+' || src.charAt(k) == '-') && (temp.length() != 0))
break; temp.append(src.charAt(k));
src.deleteCharAt(k);
} y = Integer.parseInt(temp.toString());
temp.delete(0, temp.length()); switch(op){
case '+':
sum = x + y;
src.deleteCharAt(k-1); //删除运算符
src.insert(k-1, sum + ""); //将结果存入src的操作符位置(此时操作符两边的数已经从src中删除,所以插入此位置相当于用结果代替子表达式,方便下一次运算)
break; case '-':
sum = x - y;
src.deleteCharAt(k-1);
src.insert(k-1, sum + "");
break; case '*':
sum = x * y;
src.deleteCharAt(k-1);
src.insert(k-1, sum + "");
break; case '/':
sum = x / y;
src.deleteCharAt(k-1);
src.insert(k-1, sum + "");
break; default:
break;
}
}
}
蓝桥杯 算法训练 ALGO-156 表达式计算的更多相关文章
- 蓝桥杯算法训练 java算法 表达式求值
问题描述 输入一个只包含加减乖除和括号的合法表达式,求表达式的值.其中除表示整除. 输入格式 输入一行,包含一个表达式. 输出格式 输出这个表达式的值. 样例输入 1-2+3*(4-5) 样例输出 - ...
- Java实现 蓝桥杯 算法训练 前缀表达式
算法训练 前缀表达式 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值.输入格式为:"运算符 对象1 对象2", ...
- Java实现 蓝桥杯 算法训练 多阶乘计算
试题 算法训练 多阶乘计算 问题描述 我们知道,阶乘n!表示n*(n-1)(n-2)-21, 类似的,可以定义多阶乘计算,例如:5!!=531,依次可以有n!..!(k个'!',可以简单表示为n(k) ...
- Java实现 蓝桥杯 算法训练 天数计算
试题 算法训练 天数计算 问题描述 编写函数求某年某月某日(**** ** **)是这一年的第几天 .提示:要考虑闰年,闰年的2月是29天(闰年的条件:是4的倍数但不是100的倍数,或者是400的倍数 ...
- Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...
- Java实现蓝桥杯 算法训练 大等于n的最小完全平方数
试题 算法训练 大等于n的最小完全平方数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输出大等于n的最小的完全平方数. 若一个数能表示成某个自然数的平方的形式,则称这个数为完全平 ...
- java实现 蓝桥杯 算法训练 Password Suspects
问题描述 在年轻的时候,我们故事中的英雄--国王 Copa--他的私人数据并不是完全安全地隐蔽.对他来说是,这不可接受的.因此,他发明了一种密码,好记又难以破解.后来,他才知道这种密码是一个长度为奇数 ...
- 蓝桥杯 算法训练 ALGO-116 最大的算式
算法训练 最大的算式 时间限制:1.0s 内存限制:256.0MB 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量 ...
- 蓝桥杯 算法训练 ALGO-15 旅行家的预算
算法训练 旅行家的预算 时间限制:1.0s 内存限制:256.0MB 问题描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车 ...
随机推荐
- mongodb中的__v字段
"__v"是"versionKey"的简写,当每一个文档由mongoose创建时就会自动添加,代表这该文档的版本,此属性可配置修改,默认为"__v&q ...
- 三 ip dns等配置
一IP.端口.协议基本概念 ip的简单概念 互联网上的计算机,都会有一个唯一的32位的地址,ip地址 我们访问服务器,就必须通过ip地址 局域网里也有预留的ip地址 192/10/172.居于王的i ...
- Qt配置USBCAN通信
周立功为CAN通信提供了动态库:官方提供了很多相关动态库和lib等,如图 ,其中kerneldlls里还有很多动态库,还有一个配置文件.其实这么多的文件,如果我们只用到USBCAN2通信,只需要ker ...
- dfs枚举
深度优先搜索(DFS,Depth-First Search)是搜索手段之一.它从某个状态开始,不断的转移状态知道无法转移,然后退回到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解. ...
- dependencies devDependencies peerDependencies optionalDependencies区别
原文链接: https://zhuanlan.zhihu.com/p/29855253 在一个Node.js项目中,package.json几乎是一个必须的文件,它的主要作用就是管理项目中所使用到的外 ...
- thinkphp判断更新是否成功
如何判断一个更新操作是否成功 $Model = D('Blog'); $data['id'] = 10; $data['name'] = 'update name'; $result = $Model ...
- HBase-存储-写路径
写路径 当用户向HRegionServer发起put请求时,其会将请求交给对应的HRegion实例来处理.第一步是要决定数据是否需要写到由HLog类实现的预写日志中.WAL是标准的Hadoop Seq ...
- UVA 10909 Lucky Number(树状数组+二分+YY)
此题测试时预处理等了很久,结果470ms过了...... 题意:开始不怎么懂,结果发现是这个: 波兰裔美国数学家斯塔尼斯拉夫·乌拉姆(Stanislaw Ulam)在20世纪50年代中期开发出了另一种 ...
- 从配置maven环境到maven项目的新建
话不多说,直接入正题. 一.配置maven 环境 首先安装最新版支持javaee的eclipse.我这里下载的版本是eclipse-jee-mars-2-win32-x86_64的新版(我是2017年 ...
- 解决:创建Android模拟器时提示“No system images installed for target”
今天在Eclipse上创建安卓模拟器,但发现CPU/ABI一项显示为“No system images installed for target”: 在网上搜索答案,在叶超Luka的博客中找到了答案, ...