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.
首先遍历字符串,将其中的数字和符号都转换数字,存储在某个数组cal中
遍历cal,遇到*或者/,就将它的左和右两个数按照操作符计算,消去所有的操作符。
遍历cal,计算结果。
#include <iostream>
#include <cstdlib>
#include <stack>
#include <vector>
#include <string>
using namespace std;
int calculate(string s)
{
int result = 0;
int len = s.length();
vector<int> cal;
for(int i = 0; i < len; i++)
{
if(s[i] == ' ')continue;
if(s[i] == '+'){cal.push_back(-1);continue;}
if(s[i] == '-'){cal.push_back(-2);continue;}
if(s[i] == '*'){cal.push_back(-3);continue;}
if(s[i] == '/'){cal.push_back(-4);continue;}
int temp = s[i] - 48;
for(i = i + 1; i < len; i++)
{
if(s[i] < '0' || s[i] > '9'){i--;break;}
temp = temp * 10 + s[i] - 48;
}
cal.push_back(temp);
}
for(int i = 0; i < cal.size(); i++)
{
if(cal[i] == -3)
{
cal[i - 1] = cal[i - 1] * cal[i + 1];
cal.erase(cal.begin() + i + 1);
cal.erase(cal.begin() + i);
i--;
continue;
}
if(cal[i] == -4)
{
cal[i - 1] = cal[i - 1] / cal[i + 1];
cal.erase(cal.begin() + i + 1);
cal.erase(cal.begin() + i);
i--;
}
}
int sign = 1;
for(int i = 0; i < cal.size(); i++)
{
if(cal[i] == -1){sign = 1;continue;}
if(cal[i] == -2){sign = -1;continue;}
cout<<sign<<" "<<cal[i]<<endl;
result += sign * cal[i];
}
return result;
}
int main()
{
string s = "0-2147483647";
cout<<calculate(s)<<endl;
return 0;
}