• 224. 基本计算器


     

    难度困难

    给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

    注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。

    示例 1:

    输入:s = "1 + 1"
    输出:2
    

    示例 2:

    输入:s = " 2-1 + 2 "
    输出:3
    

    示例 3:

    输入:s = "(1+(4+5+2)-3)+(6+8)"
    输出:23
    

    提示:

    • 1 <= s.length <= 3 * 105
    • s 由数字、'+''-''('')'、和 ' ' 组成
    • s 表示一个有效的表达式
    • '+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
    • '-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
    • 输入中不存在两个连续的操作符
    • 每个数字和运行的计算将适合于一个有符号的 32位 整数
     1 class Solution {
     2 public:
     3 
     4     int findclose(string s ,int start) {
     5         int level = 0;
     6         for(int i = start;i < s.size(); i++) {
     7             if (s[i]=='(') level++;
     8             if (s[i]==')') {
     9                 level--;
    10                 if (level == 0) return i-start;
    11             }
    12         }
    13         return 0;
    14     }
    15     int help(string s) {
    16         int num = 0;
    17         int top = 0;
    18         char sign = '+';
    19         stack<int> stk;
    20         for(int i =0;i < s.size();i++) {
    21             char ch = s[i];
    22             if (isdigit(ch)) {
    23                 num  = num*10 + (ch-'0');
    24             } 
    25             if (ch == '(')  {
    26                 int right = findclose(s,i);
    27                 num = help(s.substr(i+1,right));
    28                 i+=right;
    29             }
    30             if (!isdigit(ch) || i == s.size()-1) {
    31                 if (sign=='+') {
    32                     stk.push(num);
    33                 } else if (sign == '-') {
    34                     stk.push(-num);
    35                 } else if (sign == '*') {
    36                      top = stk.top();stk.pop();
    37                     stk.push(num*top);
    38                 } else if (sign == '/') {
    39                      top = stk.top();stk.pop();
    40                     stk.push(top/num);
    41                 }
    42                 sign = ch;
    43                 num = 0;
    44             }
    45         }
    46         int res = 0;
    47         while(!stk.empty()) {
    48             res +=stk.top();
    49             stk.pop();
    50         }
    51         return res;
    52     }
    53     int calculate(string s) {
    54         string fs = "" ;
    55         for (char ch : s) {
    56             if (ch != ' ') {
    57                 fs+=ch;
    58             }
    59         }
    60         return help(fs);
    61     }
    62 };
  • 相关阅读:
    记录ICallbackEventHandler 同时并发访问容易引发的问题
    IIS 属性
    Solaris10 安装
    VerifyRenderingInServerForm和EnableEventValidation引发的两个问题
    Solaris 上网配置
    动态数据类型转换
    RDLC 折线图
    codesmith复制中文乱码解决
    关于手机等品牌型号搜索与采集的中文分词分离
    说点包租公限制共享上网的破事
  • 原文地址:https://www.cnblogs.com/zle1992/p/15925472.html
Copyright © 2020-2023  润新知