题目描述
对获取的字符串进行四则运算,运算符定义如下:
【加:add】【减:sub】【乘:mul】【除:div】
输入描述
一行由一对小括号包裹的字符串,括号内由运算符与数字组成(可添加括号进行嵌套计算),如:输入字符串(add 1 2 3 (sub 5 3) ) 先计算 (sub 5 3) ,再计算(add 1 2 3 2)
输出描述
计算结果(int)
示例
输入
(add 1 2 3 (sub 5 3) (div 9 8) 7 (add 8 9 (sub 0 9) 1) 6 5)
输出
36
代码实现
import java.util.Scanner;
public class 括号嵌套四则运算 {
public static void main(String[] args) {
System.out.println("请输入:");
Scanner sc=new Scanner(System.in);
String input =sc.nextLine();
//System.out.println(input.matches("-?\\d+"));
while (!input.matches("-?\\d+")) { //匹配是否为数字(包括正数和负数)
// 规则式:-表示负号;?表示前面的-出现0次或1次;\d表示数字,java代码中需要转义;+表示至少一个
String sub = null;
int value = 0;
if (input.lastIndexOf('(')==0) {
sub = input;
}else {
if(input.lastIndexOf('(')>input.indexOf(')')) {
//System.out.println("input.lastIndexOf('(') "+input.lastIndexOf('('));
//System.out.println("input.indexOf( ')' , input.indexOf(')') ) "+input.indexOf( ')' , input.indexOf(')') ));
sub = input.substring(input.lastIndexOf('('), input.indexOf( ')' , input.lastIndexOf('('))+1);
}else {
sub = input.substring(input.lastIndexOf('('),input.indexOf(')')+1);
}
}
value = result(sub);
input = input.replace(sub, String.valueOf(value));
}
System.out.println(input);
}
private static int result(String s) {
String op=s.substring(1,4); //取操作符
s=s.substring(5,s.length()-1); //去括号
String[] sArr=s.split(" "); //分割字符串
//System.out.println(op);
int result=Integer.parseInt(sArr[0]); //存放结果
if(op.equals("add")) {
for(int i=1;i<sArr.length;i++) {
result=result+(Integer.parseInt(sArr[i]));
}
//System.out.println(result);
}
if(op.equals("sub")) {
for(int i=1;i<sArr.length;i++) {
result=result-(Integer.parseInt(sArr[i]));
}
//System.out.println(result);
}
if(op.equals("mul")) {
for(int i=1;i<sArr.length;i++) {
result=result*(Integer.parseInt(sArr[i]));
}
//System.out.println(result);
}
if(op.equals("div")) {
for(int i=1;i<sArr.length;i++) {
result=result/(Integer.parseInt(sArr[i]));
}
//System.out.println(result);
}else {
}
return result;
}
}
题目知识点总结
首先,代码中有一句比较复杂的
sub = input.substring(input.lastIndexOf('('), input.indexOf( ')' , input.lastIndexOf('('))+1);
其中涉及到的三个方法:
substring()
:
- 一个参数:
str.substring(a)
→ 截取从索引a开始到字符串结束 - 两个参数:
str.substring(a,b)
:→ 截取从索引a开始到索引b-1的字符串,左开右闭:[a,b-1)
indexOf()
- 一个参数:
indexOf(ch)
:→ 返回字符a
在字符串中第一次出现的索引号 - 两个参数:
indexOf(ch,startIndex)
:→ 返回从索引startIndex开始字符ch
第一次出现处的索引号
lastIndexOf()
- 一个参数:
lastIndexOf(ch)
:→ 返回字符a
在字符串中最后一次出现的索引号 - 两个参数:
lastIndexOf(ch,startIndex)
:→ 返回从索引startIndex开始字符ch
最后一次出现处的索引号
代码分析:
substring()
的第一个参数:input.lastIndexOf(’(’)
从字符串input
的最右边开始,向左边找到第一个出现的’(’
,返回该位置的索引号- 第二个参数
input.indexOf( ‘)’ , input.lastIndexOf(’(’))+1)
input.lastIndexOf(’(’)
从字符串input
的最右边开始,向左边找到第一个出现的’(’
,返回该位置的索引号n
然后这个式子简化为了:input.indexOf(’)’,n+1)
,从字符串input
的第(n+1)位开始,向右边找到第一个出现的’)’
,并返回该位置的索引号
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135488.html