這道題因為格式限定所以比較簡單,自己用正則表達式就給擴展了下,寫成了多項匹配的代碼,順便復習了正則,測試數據少,可能有沒發現的錯誤,如有發現請指出 [**點此直達擴展代碼**](#)
### 題目
問題描述
編寫一個程序,以字符串方式輸入一個前綴表達式,然后計算它的值。輸入格式為:“運算符 對象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);
}
}
~~~
水平不高,有好的建議歡迎留言