• LeetCode-224 Basic Calculator


    题目描述

    Implement a basic calculator to evaluate a simple expression string.

    The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negativeintegers and empty spaces .

    题目大意

    实现一个最基本的计算器,输入一个字符串,字符串中只包含 ‘0-9’,‘(’,‘)’,‘+’,‘-’,‘ ’。

    示例

    E1

    Input: "1 + 1"
    Output: 2

    E2

    Input: " 2-1 + 2 "
    Output: 3

    E3

    Input: "(1+(4+5+2)-3)+(6+8)"
    Output: 23

    解题思路

    基本不需什么复杂的算法,只需要细心的思考所有可能的情况就好。

    例如,

      输入的数字可能会布置一位数字,有可能会有多位整数;

      输入中存在负数;

      输入中存在多个多余的空格,其空格的位置不确定;

      输入的数字之前出现多余的 ‘+’ 表示正数;

      。。。

    解决方案是先对字符串进行初始化,将字符串中的空格去除,同时如果出现数字之前有多余操作符表示正负数,插入数字 ‘0’ 来表示正常的运算,方便之后的计算(例如输入的是“ -   2 +    1”会被处理成“0-2+1”)。之后通过入栈出栈操作来进行基本的算术运算即可。

    复杂度分析

    时间复杂度:O(N)

    空间复杂度:O(N)

    代码

    class Solution {
    public:
        int calculate(string s) {
            init(s);
            // 遍历字符串,将运算数与操作符分别入栈,遇到操作符 ’)‘时将该括号内的运算结 
            // 果计算完毕,并入栈
            int len = s.length();
            for(int i = 0; i < len; ++i) {
                if(s[i] >= '0' && s[i] <= '9') {
                    int tmp = s[i] - '0', j = i + 1;
                    while(s[j] >= '0' && s[j] <= '9') {
                        tmp *= 10;
                        tmp += s[j] - '0';
                        ++j;
                    }
                    num.push(tmp);
                    i = j - 1;
                }
                else {
                    if(s[i] == '(') {
                        op.push(s[i]);
                    }
                    else if(s[i] == ')') {
                        cal();
                    }
                    else {
                        op.push(s[i]);
                    }
                }
            }
            cal();
    
            return num.top();
        }
        // 处理初始的字符串,使其符合正常的运算规律
        void init(string& s) {
            bool f = true;
            string::iterator iter = s.begin();
            while(iter != s.end()) {
                if(*iter == ' ') {
                    s.erase(iter);
                }
                else if(*iter >= '0' && *iter <= '9') {
                    f = false;
                    ++iter;
                }
                else if(*iter != '(' && *iter != ')'){
                    if(f) {
                        s.insert(iter, '0');
                        f = false;
                    }
                    else {
                        f = true;
                    }
                    ++iter;
                }
                else {
                    ++iter;
                }
            }
        }
        // 进行基本运算,需注意,应使用另一个栈来保存运算树和操作数,因为第一次入栈的 
        // 顺序并非应该的运算顺序(从左向右),因此应该将顺序改变
        void cal() {
            stack<int> tmp_n;
            stack<char> tmp_o;
            while(num.size() > 1) {
                if(op.top() == '(') {
                    op.pop();
                    break;
                }
                tmp_n.push(num.top()); num.pop();
                tmp_o.push(op.top()); op.pop();
            }
            tmp_n.push(num.top()); num.pop();
            
            while(!tmp_o.empty()) {
                int a, b;
                char o = tmp_o.top();
                tmp_o.pop();
                a = tmp_n.top(); tmp_n.pop();
                b = tmp_n.top(); tmp_n.pop();
                tmp_n.push(o == '+' ? a + b : a - b);
            }
            num.push(tmp_n.top());
        }
        
    private:
        stack<int> num;
        stack<char> op;
    };
  • 相关阅读:
    好用的开源库(一)——MaterialEditText
    Android开发——Notification通知的各种Style详解
    Android开发——Notification通知的使用及NotificationCopat.Builder常用设置API
    【转】Android开发笔记(序)写在前面的目录
    【转】NotificationCopat.Builder全部设置
    Git的简单的基本使用
    Android开发——BroadcastReceiver广播的使用
    【转】Android 开发规范(完结版)
    Android开发——使用intent传递对象
    【升级至sql 2012】sqlserver mdf向上兼容附加数据库(无法打开数据库 'xxxxx' 版本 611。请将该数据库升级为最新版本。)
  • 原文地址:https://www.cnblogs.com/heyn1/p/11085022.html
Copyright © 2020-2023  润新知