ALGO-92–前缀表达式(并用正则扩展)

最后更新于:2022-04-01 09:41:34

这道题因为格式限定所以比较简单,自己用正则表达式就给扩展了下,写成了多项匹配的代码,顺便复习了正则,测试数据少,可能有没发现的错误,如有发现请指出 [**点此直达扩展代码**](#) ### 题目 问题描述 编写一个程序,以字符串方式输入一个前缀表达式,然后计算它的值。输入格式为:“运算符 对象1 对象2”,其中,运算符为“+”(加法)、“-”(减法)、“*”(乘法)或“/”(除法),运算对象为不超过10的整数,它们之间用一个空格隔开。要求:对于加、减、乘、除这四种运算,分别设计相应的函数来实现。 输入格式:输入只有一行,即一个前缀表达式字符串。 输出格式:输出相应的计算结果(如果是除法,直接采用c语言的“/”运算符,结果为整数)。 输入输出样例 样例输入 + 5 2 样例输出 7 ### 题目要求的代码 ~~~ import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); //获得输入串 String str = input.nextLine(); //把输入串以空格分成数组 String[] arr = str.split(" "); //提取出算术运算符 char[] letter = arr[0].toCharArray(); //依次计算 switch (letter[0]){ case '+': System.out.println(Integer.parseInt(arr[1])+Integer.parseInt(arr[2])); break; case '-': System.out.println(Integer.parseInt(arr[1])-Integer.parseInt(arr[2])); break; case '*': System.out.println(Integer.parseInt(arr[1])*Integer.parseInt(arr[2])); break; case '/': System.out.println(Integer.parseInt(arr[1])/Integer.parseInt(arr[2])); break; } } } ~~~ ### 扩展的通用代码 ~~~ import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by nl101 on 2016/1/22. */ public class Main1 { public static void main(String[] args) { //测试数据((12+2)-6)/2 String str = "/ - + 12 2 6 2"; System.out.println(prefix(str)); } private static String prefix(String str){ //用于匹配 运算符 空格 数字 空格 数字的正则 Pattern p = Pattern.compile("[\\+\\-\\*\\/][\\s]\\d{1,}[\\s]\\d{1,}"); Matcher matcher = p.matcher(str); //开始匹配 while (matcher.find()){ //计算匹配的值 如,+ 12 2 则返回14 String temp = calculate(matcher.group()); StringBuffer sb = new StringBuffer(); //替换上面的为计算出来的数值 matcher.appendReplacement(sb,temp); //追加剩余子串 matcher.appendTail(sb); str = sb.toString(); //或者上面都注释掉用下面一句话都可以了 // str = matcher.replaceFirst(calculate(matcher.group())); //递归循环 return prefix(str); } return str; } /** * 和第一个程序一样,计算出来+ 12 2这种类型数值 * @param str * @return */ private static String calculate(String str){ String[] arr = str.split(" "); int i = 0; char[] letter = arr[0].toCharArray(); switch (letter[0]){ case '+': i = Integer.parseInt(arr[1])+Integer.parseInt(arr[2]); break; case '-': i = Integer.parseInt(arr[1])-Integer.parseInt(arr[2]); break; case '*': i = Integer.parseInt(arr[1])*Integer.parseInt(arr[2]); break; case '/': i = Integer.parseInt(arr[1])/Integer.parseInt(arr[2]); break; } return String.valueOf(i); } } ~~~ 水平不高,有好的建议欢迎留言
';