224. Basic Calculator

一、题目

  1、审题

  

  2、分析

    给出字符串表示的包含有 +、-、( 、) 运算符以及空格、数字的整形运算,求出其结果。

 

二、解答

  1、思路

    循环遍历 S 中的字符 c:

    ①、当 c == 数字:将与其相邻的数字组合成整数。

    ②、当 c == ‘+’ : 前一个操作数输入完毕,开始新的运算,且为加法运算。

    ③、当 c == -: 前一个操作数输入完毕,开始新的运算,且为减法运算。

    ④、当 c == '(':将前边的运算结果 result 与操作符 sign 压入栈,开始新的运算,result、sign初始化。

    ⑤、当 c == ')': 结束当前() 内的运算,且将 Stack 中的栈顶两个元素出栈进行运算。

 

 1     public int calculate3(String s) {
 2         Stack<Integer> stack = new Stack<>();
 3         int result = 0, number = 0;
 4         int sign = 1;
 5         for (int i = 0; i < s.length(); i++) {
 6             char c = s.charAt(i);
 7             if(Character.isDigit(c)) {
 8                 number = number * 10 + (c - '0');
 9             }
10             else if(c == '+') {
11                 result += sign * number;
12                 number = 0;
13                 sign = 1;
14             }
15             else if(c == '-') {
16                 result += sign * number;
17                 number = 0;
18                 sign = -1;
19             }
20             // 开始一次新的运算 ①、先记录之前值 ②、从新开始计数,因为 ( 之前必有 +或-,所以 number = 0 是默认的
21             else if(c == '(') { 
22                 stack.push(result);
23                 stack.push(sign);
24                 sign = 1;
25                 result = 0;
26             }
27             // 结束当前一次计数, ①、先结束当前()内的运算,②、加上()之前的一次运算。
28             else if(c == ')') {
29                 result += sign * number;
30                 result *= stack.pop();
31                 result += stack.pop();
32                 number = 0;
33             }
34         }
35         if(number != 0)
36             result += sign * number;
37         return result;
38     }

  

  优化: 每次将一个运算数单独处理完毕,与 ‘+’、‘-’ 号分开处理。

 1 public int calculate(String s) {
 2         Stack<Integer> stack = new Stack<>();
 3         int len = s.length();
 4         int sign = 1, result = 0;
 5         for (int i = 0; i < len; i++) {
 6             char ch = s.charAt(i);
 7             if(Character.isDigit(ch)) {
 8                 int sum = ch - '0';
 9                 while(i+1 < len && Character.isDigit(s.charAt(i+1))) {
10                     sum = sum * 10 + s.charAt(i + 1) - '0';
11                     i++;
12                 }
13                 result += sign * sum;
14             }
15             else if(ch == '+')
16                 sign = 1;
17             else if(ch == '-')
18                 sign = -1;
19             else if(ch == '(') {
20                 stack.push(result);
21                 stack.push(sign);
22                 result = 0;
23                 sign = 1;
24             }
25             else if(ch == ')') {
26                 result *= stack.pop();
27                 result += stack.pop();
28             }
29         }
30         return result;
31     }

 

posted @ 2018-11-07 15:47  skillking2  阅读(121)  评论(0编辑  收藏  举报