[LeetCode] 227. Basic Calculator II 基本计算器之二
Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negativeintegers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.
Example 1:
Input: "3+2*2"
Output: 7
Example 2:
Input: " 3/2 "
Output: 1
Example 3:
Input: " 3+5 / 2 "
Output: 5
Note:
- You may assume that the given expression is always valid.
 - Do not use the 
evalbuilt-in library function. 
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
这道题是之前那道 Basic Calculator 的拓展,不同之处在于那道题的计算符号只有加和减,而这题加上了乘除,那么就牵扯到了运算优先级的问题,好在这道题去掉了括号,还适当的降低了难度,估计再出一道的话就该加上括号了。不管那么多,这道题先按木有有括号来处理,由于存在运算优先级,我们采取的措施是使用一个栈保存数字,如果该数字之前的符号是加或减,那么把当前数字压入栈中,注意如果是减号,则加入当前数字的相反数,因为减法相当于加上一个相反数。如果之前的符号是乘或除,那么从栈顶取出一个数字和当前数字进行乘或除的运算,再把结果压入栈中,那么完成一遍遍历后,所有的乘或除都运算完了,再把栈中所有的数字都加起来就是最终结果了,参见代码如下:
解法一:
class Solution {
public:
    int calculate(string s) {
        long res = , num = , n = s.size();
        char op = '+';
        stack<int> st;
        for (int i = ; i < n; ++i) {
            if (s[i] >= '') {
                num = num *  + s[i] - '';
            }
            if ((s[i] < '' && s[i] != ' ') || i == n - ) {
                if (op == '+') st.push(num);
                if (op == '-') st.push(-num);
                if (op == '*' || op == '/') {
                    int tmp = (op == '*') ? st.top() * num : st.top() / num;
                    st.pop();
                    st.push(tmp);
                }
                op = s[i];
                num = ;
            }
        }
        while (!st.empty()) {
            res += st.top();
            st.pop();
        }
        return res;
    }
};
在做了 Basic Calculator III 之后,再反过头来看这道题,发现只要将处理括号的部分去掉直接就可以在这道题上使用,参见代码如下:
解法二:
class Solution {
public:
    int calculate(string s) {
        long res = , curRes = , num = , n = s.size();
        char op = '+';
        for (int i = ; i < n; ++i) {
            char c = s[i];
            if (c >= '' && c <= '') {
                num = num *  + c - '';
            }
            if (c == '+' || c == '-' || c == '*' || c == '/' || i == n - ) {
                switch (op) {
                    case '+': curRes += num; break;
                    case '-': curRes -= num; break;
                    case '*': curRes *= num; break;
                    case '/': curRes /= num; break;
                }
                if (c == '+' || c == '-' || i == n - ) {
                    res += curRes;
                    curRes = ;
                }
                op = c;
                num = ;
            }
        }
        return res;
    }
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/227
类似题目:
参考资料:
https://leetcode.com/problems/basic-calculator-ii/
https://leetcode.com/problems/basic-calculator-ii/discuss/63003/Share-my-java-solution
https://leetcode.com/problems/basic-calculator-ii/discuss/63004/17-lines-C++-easy-20-ms
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] 227. Basic Calculator II 基本计算器之二的更多相关文章
- [LeetCode] Basic Calculator II 基本计算器之二
		
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
 - [LeetCode] 227. Basic Calculator II 基本计算器 II
		
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
 - LeetCode#227.Basic Calculator II
		
题目 Implement a basic calculator to evaluate a simple expression string. The expression string contai ...
 - Java for LeetCode 227 Basic Calculator II
		
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
 - (medium)LeetCode  227.Basic Calculator II
		
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
 - 【LeetCode】227. Basic Calculator II 解题报告(Python)
		
[LeetCode]227. Basic Calculator II 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...
 - leetcode 224. Basic Calculator 、227. Basic Calculator II
		
这种题都要设置一个符号位的变量 224. Basic Calculator 设置数值和符号两个变量,遇到左括号将数值和符号加进栈中 class Solution { public: int calcu ...
 - 【LeetCode】227. Basic Calculator II
		
Basic Calculator II Implement a basic calculator to evaluate a simple expression string. The express ...
 - 224. Basic Calculator + 227. Basic Calculator II
		
▶ 两个四则表达式运算的题目,第 770 题 Basic Calculator IV 带符号计算不会做 Orz,第 772 题 Basic Calculator III 要收费 Orz. ▶ 自己的全 ...
 
随机推荐
- paramiko 远程执行多个命令
			
转发博客如下 https://blog.csdn.net/c_base_jin/article/details/86561445
 - JSP页面的注释细节
			
业务场景:通过后台传参,jstl标签控制一个页签是否显示,不过现在要去掉判断,直接让页签显示 在sublime直接这样注释,然后刷新,一直找不到标签显示,其它的都是正常的 <!--<c:i ...
 - Composer 的安装
			
最近在家休息了两个月,本来打算看看书,结果和朋友做了个小项目.项目也差不多接近尾声了,就准备找工作了,朋友推荐我去他们公司做事,不过是使用 PHP 进行开发了.我这一年来使用 Java 进行开发,今后 ...
 - poj-2935  BFS Basic Wall Maze
			
Basic Wall Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3384 Accepted: 1525 ...
 - MySQL优化常见Extra分析——慢查询优化
			
数据准备: create table user ( id int primary key, name ), sex ), index(name) )engine=innodb; 数据说明:用户表:id ...
 - 车位iou计算
			
车位检测中,判断多帧图像检测出的车位是否是同一个车位.计算其IOU. 判断一个点是否在一个四边形内 Approach : Let the coordinates of four corners be ...
 - java架构之路-(tomcat网络模型)简单聊聊tomcat(二)
			
上节课我们说到的Tomcat,并且给予了一般的tomcat配置,和配置的作用,提到了HTTP/1.1 也就是我们的网络通讯模型,那么HTTP/1.1又代表什么呢.我们来简答看一下. tomcat有四种 ...
 - Linux CentOS内核升级
			
1. 说明 正在使用的阿里云服务器报了几个内核漏铜,使用自带[一键修复]需要额外的支付费用,所以尝试采用升级系统内核的方式来修复漏洞. 1.1 服务器参数 操作系统:CentOS 7.4 64位 当前 ...
 - 微信测试号:config:invalid url domain
			
今天调试微信分享的时候,配置参数时一直提示config:invalid url domain,网上找了一下,都说是appId和域名没有绑定.仔细看了下,有绑定没错.又猜测是不是二级域名的问题,因为是测 ...
 - scrapy学习笔记(二)框架结构工作原理
			
scrapy结构图: scrapy组件: ENGINE:引擎,框架的核心,其它所有组件在其控制下协同工作. SCHEDULER:调度器,负责对SPIDER提交的下载请求进行调度. DOWNLOADER ...