LeetCode227. Basic Calculator II
来源:互联网 发布:绘制贴图的软件 编辑:程序博客网 时间:2024/04/30 14:24
题目链接:
https://leetcode.com/problems/basic-calculator-ii/
题目描述:
计算字符串表达式的值。可能会有多余空格。
题目分析:
这道题对于我来说坑略多啊。字符串表达式中的数字可能为多位数。比如
345*16,第一次就跪这上面了,我没注意这个问题,以为只有个位。
这样解决就好。
while (i < len && s[i] >= '0' && s[i] <= '9'){ num = num * 10 + (s[i] - '0'); i++;}
我最开始想的是当即将加入操作符栈的运算符优先级小于栈顶运算符优先级,就将操作数栈弹出两个数先与操作符栈的栈顶运算符运算,直到栈顶运算符优先级与即将入栈的运算符优先级相同。
其实不用这么麻烦啊 ╮(╯_╰)╭。
我在遍历的时候直接先把乘除算了啊,之后再算一次加减就好了啊。
在新数字加入操作数栈前,看看操作符栈的栈顶运算符是不是乘除,如果是就计算后,再加入。
最后算加减的时候,简直被自己蠢哭了。
while (OPD.size() >= 2 && !OPR.empty()){ char ch = OPR.top(); OPR.pop(); int num1 = OPD.top(); OPD.pop(); int num2 = OPD.top(); OPD.pop(); num1 = calculate(num1, num2, ch); OPD.push(num1); } return OPD.top();
怎么能这样算呢,加入栈后,是反起来的了。
比如0-2 是为-2,此时操作数栈中栈顶是2,如果按我的代码来就是2-0=2,蠢哭啊。
正确的应该是:
int res=0; while (!OPR.empty()){ int tmp=OPD.top(); char ch=OPR.top(); if(ch=='-'){ tmp=-tmp; } res+=tmp; OPD.pop(); OPR.pop(); } res+=OPD.top(); return res;
十分感谢
http://blog.csdn.net/brucehb/article/details/46593913
class Solution {public: stack<int> OPD; stack<char> OPR; int calculate(int num1, int num2, char opr){ switch (opr){ case '+':{ return num1 + num2; } case '-':{ return num1 - num2; } case '*':{ return num1*num2; } case '/':{ return num1 / num2; } } } int calculate(string s) { int len = s.size(); int i=0; while(i<len){ if (s[i] == ' '){ i++; } else if (s[i] == '+' || s[i] == '-' || s[i]=='*' || s[i]=='/'){ OPR.push(s[i]); i++; } else{ int num = 0; while (i < len && s[i] >= '0' && s[i] <= '9'){ num = num * 10 + (s[i] - '0'); i++; } if (!OPR.empty() && (OPR.top()=='/' || OPR.top()=='*')){ num = calculate(OPD.top(),num,OPR.top()); OPR.pop(); OPD.pop(); } OPD.push(num); } } int res=0; while (!OPR.empty()){ int tmp=OPD.top(); char ch=OPR.top(); if(ch=='-'){ tmp=-tmp; } res+=tmp; OPD.pop(); OPR.pop(); } res+=OPD.top(); return res; }};
0 0
- LeetCode227:Basic Calculator II
- LeetCode227. Basic Calculator II
- leetcode227. Basic Calculator II
- leetcode227-Basic Calculator II(简单计算器的实现)
- Basic Calculator & Basic Calculator II
- [LeetCode] Basic Calculator II
- Basic Calculator II
- [leetcode] Basic Calculator II
- leetcode Basic Calculator II
- Basic Calculator II
- 227Basic Calculator II
- 【LeetCode】Basic Calculator II
- Basic Calculator II
- [Leetcode]Basic Calculator II
- Basic Calculator II
- Basic Calculator II
- Basic Calculator II
- Basic Calculator II(**)
- 别让惰性控制你
- 多字段搜索 (一) - 多个及单个查询字符串
- Android AccessibilityService 应用之微信抢红包外挂
- Zend Studio配置
- XFire的webservice应用
- LeetCode227. Basic Calculator II
- 乘法口诀表
- iOS之Reachability和AFN判断网络连接状态
- 一些前端设计相关网站收集
- 智能卡数据传输T=1传输协议
- system/build.prop各行代码解释
- linux修改ethx
- 获取Android屏幕尺寸、控件尺寸、状态栏/通知栏高度、导航栏高度
- 在父菜单和子菜单在同一张表的级联怎么做啊