计算表达式

前言:

    表达式计算要考虑运算优先级问题,可以将数字和运算符存放到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、

posted @ 2016-08-24 15:23  华不摇曳  阅读(427)  评论(0编辑  收藏  举报