zoukankan      html  css  js  c++  java
  • 【LeetCode-栈/数学】基本计算器 II

    题目描述

    实现一个基本的计算器来计算一个简单的字符串表达式的值。

    字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
    示例:

    输入: "3+2*2"
    输出: 7
    
    输入: " 3/2 "
    输出: 1
    
    输入: " 3+5 / 2 "
    输出: 5
    

    说明:

    • 你可以假设所给定的表达式都是有效的。
    • 请不要使用内置的库函数 eval。

    题目链接: https://leetcode-cn.com/problems/basic-calculator-ii/

    思路

    使用一个栈 nums 存储计算的中间结果,使用变量 preOpr 记录前一个运算符,假设当前数字是 cur:

    • 如果 preOpr=='+',则将 cur 入栈;
    • 如果 preOpr=='-',则将 -cur 入栈;
    • 如果 preOpr=='*',因为 * 的优先级比加减高,所以将 nums 栈顶元素乘以 cur;
    • 如果 preOpr=='/',因为 / 的优先级比加减高,所以将 nums 栈顶元素除以 cur;

    这样的话,将字符串遍历一遍,栈中就会存储一些中间结果。我们将栈中的中间结果全部相加就是最终的答案。

    代码如下:

    class Solution {
    public:
        int calculate(string s) {
            if(s.empty()) return 0;
    
            stack<int> nums;
            char preOpr = '+';
            int cur = 0;
            s += "#"; // 表示字符串结束,最后一个数字进入else分支
            for(int i=0; i<s.size(); i++){
                if(s[i]==' ') continue;
                if(isdigit(s[i])){
                    cur = cur * 10 + (s[i] - '0');
                }else{
                    if(preOpr=='+') nums.push(cur);
                    else if(preOpr=='-') nums.push(-cur);
                    else if(preOpr=='*') nums.top() *= cur;
                    else if(preOpr=='/') nums.top() /= cur;
                    cur = 0;
                    preOpr = s[i];
                }
            }
    
            int ans = 0;
            while(!nums.empty()){
                ans += nums.top();
                nums.pop();
            }
            return ans;
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(n)

    参考

    https://leetcode-cn.com/problems/basic-calculator-ii/solution/li-yong-zhan-jiang-si-ze-yun-suan-hua-jian-cheng-j/

  • 相关阅读:
    js初学
    普通的checkbox的回显功能
    Jquery的显示与隐藏
    jQuery 事件
    jquery选择器(1)
    页面截取字段和转码,页面截取字段时候需要进入JS
    页面中的多选框的非空判断
    jquery中清空
    java代码拼写sql
    iframe中用到的例子
  • 原文地址:https://www.cnblogs.com/flix/p/13305572.html
Copyright © 2011-2022 走看看