Basic Calculator II | LeetCode 48ms C++ Solution
2015-11-22 22:33
453 查看
Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers,
and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
Note: Do not use the
library function.
解题思路:这里首先需要考虑的就是*和/,即乘法和除法相对于减法和加法的优先级。所以这里使用两个栈,分别存储操作符和操作数
操作符只存储加号和减号,当遇到乘号和除法时,立即进行计算并压入栈,代码如下:
int calculate(string s) {
int res=0;
int size=s.size();
stack<int> numbers;
stack<char> operate;
operate.push('+');
for(int i=0;i<size;){
char cur=s[i];
//跳过空格
if(cur==' '){
++i;
continue;
}
//处理乘法和除法
if(cur=='*'||cur=='/'){
int step=i+1;
while(s[step]==' ')
++step;
int num=0;
while(s[step]>='0'&&s[step]<='9'){
num=num*10+s[step]-'0';
++step;
}
i=step;
int num2=numbers.top();
numbers.pop();
if(cur=='*'){
num=num*num2;
}else{
num=num2/num;
}
numbers.push(num);
continue;
}else if(cur=='-'||cur=='+'){
operate.push(cur);
++i;
}else{
int step=i;
int num=0;
while(s[step]>='0'&&s[step]<='9'){
num=num*10+s[step]-'0';
++step;
}
i=step;
numbers.push(num);
}
}
// return numbers.top();
while(!numbers.empty()){
char oper=operate.top();
operate.pop();
int num=numbers.top();
numbers.pop();
if(oper=='-')
res+=(-1*num);
else
res+=num;
}
return res;
}
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
evalbuilt-in
library function.
解题思路:这里首先需要考虑的就是*和/,即乘法和除法相对于减法和加法的优先级。所以这里使用两个栈,分别存储操作符和操作数
操作符只存储加号和减号,当遇到乘号和除法时,立即进行计算并压入栈,代码如下:
int calculate(string s) {
int res=0;
int size=s.size();
stack<int> numbers;
stack<char> operate;
operate.push('+');
for(int i=0;i<size;){
char cur=s[i];
//跳过空格
if(cur==' '){
++i;
continue;
}
//处理乘法和除法
if(cur=='*'||cur=='/'){
int step=i+1;
while(s[step]==' ')
++step;
int num=0;
while(s[step]>='0'&&s[step]<='9'){
num=num*10+s[step]-'0';
++step;
}
i=step;
int num2=numbers.top();
numbers.pop();
if(cur=='*'){
num=num*num2;
}else{
num=num2/num;
}
numbers.push(num);
continue;
}else if(cur=='-'||cur=='+'){
operate.push(cur);
++i;
}else{
int step=i;
int num=0;
while(s[step]>='0'&&s[step]<='9'){
num=num*10+s[step]-'0';
++step;
}
i=step;
numbers.push(num);
}
}
// return numbers.top();
while(!numbers.empty()){
char oper=operate.top();
operate.pop();
int num=numbers.top();
numbers.pop();
if(oper=='-')
res+=(-1*num);
else
res+=num;
}
return res;
}
相关文章推荐
- 在C++中使用GOLANG的协程
- C++迭代开发流程的理解
- 013--VS2013 C++ 地图贴图-其它格式图片
- [C++]分数计算器(四则运算)class
- C++ virtual 继承
- C++ virtual 继承
- C++virtual继承
- C++中的explicit关键字
- VC++老是提示“致命错误:无法打开头文件AFXRES.H”怎么回事 提示在另一个编辑器中打开,怎么解决
- c++ STL 算法库用法
- c语言输出的%
- C++中endl的本质是什么
- C++中endl的本质是什么
- C++程序的存储空间布局
- C语言清空文件内容
- C/C++学习总结(复习)
- 几种C++分词软件
- Some Notes of Protocol Buffer C++
- c++输入
- c语言scanf()函数和gets()函数的区别