zoukankan      html  css  js  c++  java
  • LeetCode 227. 基本计算器 II 栈 双指针

    地址 https://leetcode-cn.com/problems/basic-calculator-ii/

    实现一个基本的计算器来计算一个简单的字符串表达式的值。
    
    字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格  。 整数除法仅保留整数部分。
    
    示例 1:
    
    输入: "3+2*2"
    输出: 7
    示例 2:
    
    输入: " 3/2 "
    输出: 1
    示例 3:
    
    输入: " 3+5 / 2 "
    输出: 5
    说明:
    
    你可以假设所给定的表达式都是有效的。
    请不要使用内置的库函数 eval。

    算法1
    有了加减乘除多种符号后 就要考虑符号优先级
    解决办法是遇到+- 符号 数字入栈
    遇到*/则再入栈下一个数字后进行计算 然后计算结果入栈
    最后整个符号栈应该就只剩同级别的+-符号了
    这时候应该从前往后计算而不是使用栈的倒序计算
    所以本题我数据结构选用了deque 而不是stack

    有不同级别的操作符号 需要stack辅助 逆序计算

    如果全部操作符号相同那么从前至后计算即可

    C++ 代码

    class Solution {
    public:
        deque<int> deNum;
        deque<int> deOp;
    
        int calc(int a, int b, char op) {
            if (op == '+') return a + b;
            if (op == '-') return a - b;
            if (op == '/') return a / b;
            if (op == '*') return a * b;
            return -9999999;
        }
    
        int calculate(string s) {
            int opFlag = 0;
            for (int i = 0; i < s.size(); i++) {
                if (s[i] == '*' || s[i] == '/' ) {
                    opFlag = 1;  deOp.push_back(s[i]);
                }
                else if (s[i] == '+' || s[i] == '-') {
                    deOp.push_back(s[i]);
                }
                else if (s[i] == ' ') {
                    continue;
                }
                else {
                    int l = i;
                    while (l < s.size() && s[l] == ' ') l++;
                    int r = l + 1;
                    while (r < s.size() && s[r] >= '0' && s[r] <= '9') r++;
                    string strNum = s.substr(l, r - l);
                    int n = atoi(strNum.c_str());
                    deNum.push_back(n);
                    i = r - 1;
                    if (opFlag == 1) {
                        opFlag = 0;
                        int a = deNum.back(); deNum.pop_back();
                        int b = deNum.back(); deNum.pop_back();
                        char op = deOp.back(); deOp.pop_back();
                        int c = calc(b, a, op);
                        deNum.push_back(c);
                    }
                }
            }
    
            while (!deOp.empty()) {
                //相同级别符号 从前面计算
                int a = deNum.front(); deNum.pop_front();
                int b = deNum.front(); deNum.pop_front();
                char op = deOp.front(); deOp.pop_front();
                int c = calc(a, b, op);
                deNum.push_front(c);
            }
    
            return deNum.front();
        }
    };
    
     
  • 相关阅读:
    Java中断机制
    RPC原理
    synchronized和ReentrantLock的区别
    dubbo入门
    Zookeeper入门
    分布式事务
    Mysql索引会失效的几种情况
    java代码执行过慢的问题定位
    持续集成
    Mycat 数据库分库分表中间件
  • 原文地址:https://www.cnblogs.com/itdef/p/14184027.html
Copyright © 2011-2022 走看看