• 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     }
  • 相关阅读:
    钟国晨160809323(作业5)
    12
    11
    第九次
    8作业
    第七次作业
    6
    林昊5
    计算机网络原理与应用笔记 3/29
    计算机网络原理与应用笔记 3/22
  • 原文地址:https://www.cnblogs.com/skillking/p/9922943.html
Copyright © 2020-2023  润新知