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();
        }
    };
    
     
  • 相关阅读:
    LVS基于DR模式负载均衡的配置
    Linux源码安装mysql 5.6.12 (cmake编译)
    HOSt ip is not allowed to connect to this MySql server
    zoj 3229 Shoot the Bullet(无源汇上下界最大流)
    hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割
    poj 2391 Ombrophobic Bovines(最大流+floyd+二分)
    URAL 1430 Crime and Punishment
    hdu 2048 神、上帝以及老天爷(错排)
    hdu 3367 Pseudoforest(最大生成树)
    FOJ 1683 纪念SlingShot(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/itdef/p/14184027.html
Copyright © 2011-2022 走看看