刷题中【括号嵌套版四则运算】

有目标就不怕路远。年轻人.无论你现在身在何方.重要的是你将要向何处去。只有明确的目标才能助你成功。没有目标的航船.任何方向的风对他来说都是逆风。因此,再遥远的旅程,只要有目标.就不怕路远。没有目标,哪来的劲头?一车尔尼雷夫斯基

导读:本篇文章讲解 刷题中【括号嵌套版四则运算】,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

题目描述

对获取的字符串进行四则运算,运算符定义如下:
【加: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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!