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);
}
}
~~~
水平不高,有好的建议欢迎留言