Basic Calculator II

Implement a basic calculator to evaluate a simple expression string.

The expression string contains only non-negative integers, +-*/ operators and empty spaces . The integer division should truncate toward zero.

You may assume that the given expression is always valid.

Some examples:

"3+2*2" = 7
" 3/2 " = 1
" 3+5 / 2 " = 5

Note: Do not use the eval built-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) {
stack<int> num;
stack<char> op;
int i = ;
while(i < s.size())
{
while(i < s.size() && s[i] == ' ')
i ++;
if(i == s.size())
break;
if(s[i] == '+' || s[i] == '-' || s[i] == '*' || s[i] == '/')
{
op.push(s[i]);
i ++;
}
else
{
int n = ;
while(i < s.size() && s[i] >= '' && s[i] <= '')
{
n = n * + (s[i]-'');
i ++;
}
num.push(n);
if(!op.empty() && (op.top() == '*' || op.top() == '/'))
{
int n2 = num.top();
num.pop();
int n1 = num.top();
num.pop();
if(op.top() == '*')
num.push(n1 * n2);
else
num.push(n1 / n2);
op.pop();
}
}
}
// '+'/'-' in order
if(!op.empty())
{
// reverse num and op
stack<int> num2;
while(!num.empty())
{
num2.push(num.top());
num.pop();
}
num = num2;
stack<char> op2;
while(!op.empty())
{
op2.push(op.top());
op.pop();
}
op = op2; while(!op.empty())
{
// pay attention to the operands order!
int n1 = num.top();
num.pop();
int n2 = num.top();
num.pop();
if(op.top() == '+')
num.push(n1 + n2);
else
num.push(n1 - n2);
op.pop();
}
}
return num.top();
}
};

最新文章

  1. UVALive 6916---Punching Robot(卢卡斯+容斥)
  2. asp.net和js读取文件的MD5值的方法
  3. Bzoj2648 SJY摆棋子
  4. BestCoder Round #71 (div.2)
  5. HoloLens开发手记 - Unity之Spatial mapping 空间映射
  6. PS4 的下载速度问题
  7. ckeditor
  8. 【hoj】1604 cable master
  9. python中的pip安装
  10. Oracle-1 - :超级适合初学者的入门级笔记,CRUD,事务,约束 ......
  11. JAVA 第二天 关键字
  12. laravel中ajax,post传值问题
  13. orcal - 增删改
  14. 基于SurfaceView的可拖动视频控件
  15. 一次BurpSuite无法抓https包定位
  16. 2018 湖南网络比赛题 HDU - 6286 (容斥)
  17. class=&quot;no-js&quot;
  18. 包含mysql 递归查询父节点 和子节点
  19. Android 文件的读取和写入
  20. java 枚举 封装操作方法

热门文章

  1. Tensorflow动态seq2seq使用总结(r1.3)
  2. 一文学会用 Tensorflow 搭建神经网络
  3. C#获取程序启动目录
  4. 怎样将 MySQL 迁移到 MariaDB 上
  5. wamp设置自定义域名访问php网站
  6. USACO Arithmetic Progressions(暴力)
  7. Eclipse使用hibernate插件
  8. artTemplate--使用artTemplate时,由于json对象属性有特殊格式 导致调用报错artTemplate,syntax error,Template Error
  9. achartengine刷新数据
  10. 【转】开发者可以使用Docker做什么?