前言:
表达式计算要考虑运算优先级问题,可以将数字和运算符存放到list内,然后进行相应的运算再输出。
题目描述
对于一个不存在括号的表达式进行计算
输入描述:
存在多种数据,每组数据一行,表达式不存在空格
输出描述:
输出结果
输入例子:
6/2+3+3*4
输出例子:
18
1 import java.util.ArrayList; 2 import java.util.Scanner; 3 4 public class 计算表达式 { 5 6 public static void main(String[] args) { 7 Scanner in = new Scanner(System.in); 8 while (in.hasNext()) { 9 ArrayList<Character> operator = new ArrayList<>(); // 存放运算符+、- 10 ArrayList<Double> number = new ArrayList<>(); // 存放数字 11 String exp = in.nextLine(); // 输入运算表达式 12 double num = 0; 13 int tmp; 14 for (int i = 0; i < exp.length(); i++) { // 依次读取每一位的字符 15 switch (exp.charAt(i)) { 16 case '+': 17 operator.add('+');// 当遇到+的时候,将运算符+加入operator列表内 18 number.add(num); // 将上一位字符的数字加入number列表中 19 num = 0; 20 break; 21 case '-': 22 operator.add('-'); 23 number.add(num); 24 num = 0; 25 break; 26 case '*': 27 tmp = getNumber(exp, i + 1); // 解析下一位的数字 28 num = num * tmp; 29 i += (tmp + "").length(); 30 break; 31 case '/': 32 tmp = getNumber(exp, i + 1); 33 num = num / tmp; 34 i += (tmp + "").length(); 35 break; 36 default: 37 // 解析当前字符位上的数字,如果数字是123这样连续的几位,会持续向下读并解析直到num=123解析完成为止 38 num = num * 10 + Integer.parseInt(exp.charAt(i) + ""); 39 break; 40 } 41 } 42 number.add(num); //将解析完的最后一位数字放入列表 43 //使用list的remove方法进行和队列的相似操作,将数字和运算符从头取出 44 double result = number.remove(0); 45 while (operator.size() > 0) { 46 switch (operator.remove(0)) { 47 case '+': 48 result += number.remove(0); 49 break; 50 case '-': 51 result -= number.remove(0); 52 break; 53 } 54 } 55 System.out.println((int) result); 56 } 57 in.close(); 58 } 59 60 /** 61 * 获取下一个数字 62 * @param exp 表达式 63 * @param pos 当前位置 64 * @return 65 */ 66 static int getNumber(String exp, int pos) { 67 int num = 0; 68 while (!(pos >= exp.length() || exp.charAt(pos) > '9' || exp.charAt(pos) < '0')) { 69 // 保证下一位的数字合法,不是其他字符 70 num = num * 10 + exp.charAt(pos) - '0'; 71 pos++; 72 } 73 return num; 74 } 75 76 }
具体解析在注释里。 by Still、