zoukankan      html  css  js  c++  java
  • LeetCode-227 Basic Calculator II

    题目描述

    Implement a basic calculator to evaluate a simple expression string.

    The expression string contains only non-negative integers, +-*/ operators and empty spaces . The integer division should truncate toward zero.

    题目大意

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

    示例

    E1

    Input: "3+2*2"
    Output: 7

    E2

    Input: " 3/2 "
    Output: 1

    E3

    Input: " 3+5 / 2 "
    Output: 5

    解题思路

    算法要比LeetCode-224简单一些,由于没有小括号,只需要依次从左至右计算就好,可以使用一个数组来保存四个运算符的优先值,在进行计算的时候,将当前的运算符与栈顶保存的运算符比较优先级,若优先级较高则入栈,否则先将栈顶的运算符计算完毕。

    复杂度分析

    时间复杂度:O(N)

    空间复杂度:O(N)

    代码

    class Solution {
    public:
        int calculate(string s) {
            int len = s.length();
            // 将字符串转变为优先级数组中的索引位置,方便之后的比较
            oti['+'] = 0;
            oti['-'] = 1;
            oti['*'] = 2;
            oti['/'] = 3;
            // 依次遍历字符串
            for(int i = 0; i < len; ++i) {
                // 遇到空格跳过
                if(s[i] == ' ')
                    continue;
                // 遇到数字入栈
                else if(s[i] >= '0' && s[i] <= '9') {
                    int tmp = s[i] - '0', j = i + 1;
                    while(j < len && s[j] >= '0' && s[j] <= '9') {
                        tmp *= 10;
                        tmp += s[j] - '0';
                        ++j;
                    }
                    i = j - 1;
                    num.push(tmp);
                }
                // 遇到操作符进行优先级判断,再进行计算和入栈操作
                else {
                    while(!op.empty()) {
                        if(!prio[oti[op.top()]][oti[s[i]]])
                            break;
                        cal();
                    }
                    op.push(s[i]);
                }
            }
            while(num.size() > 1) 
                cal();
            
            return num.top();
        }
        // 将栈顶的两个数字按照操作数栈顶的运算方法计算
        void cal() {
            int a, b, res;
            char o = op.top();
            b = num.top(); num.pop();
            a = num.top(); num.pop();
            op.pop();
            switch(o) {
                case '+' : res = a + b; break;
                case '-' : res = a - b; break;
                case '*' : res = a * b; break;
                case '/' : res = a / b; break;
            }
            num.push(res);
        }
        
    private:
        // 保存四个运算符的优先级大小,顺序依次为‘+’,‘-’,‘*’,‘’
        bool prio[4][4] = {
            {true, true, false, false},
            {true, true, false, false},
            {true, true, true, true},
            {true, true, true, true}
        };
        stack<int> num;
        stack<char> op;
        map<char, int> oti;
    };
  • 相关阅读:
    memcached事故
    总算会用sphinx生成文档了
    python tip
    抓包工具wireshark
    狗日的用户体验
    python tip
    pymmseg
    memcached事故
    windwos序列号
    7z fromat on ubuntu&replace my fujishu electric fan
  • 原文地址:https://www.cnblogs.com/heyn1/p/11088775.html
Copyright © 2011-2022 走看看