|
//计算器
#include<iostream>
#include <sstream>
#include<algorithm> //STL通用算法
#include<string> //字符串类
#include<vector> //STL 动态数组容器
//字符串转换为数值
template <typename T>
T string_value( const std::string& str )
{
T value;
std::stringstream( str.c_str() ) >> value;
return value;
}
double calculator(const std::string& expression)
{
std::string s = expression;
double result = 0;
std::string strNumber="";
std::vector<double> nums;
std::vector<char> ops;
for(long i = 0; i < s.size(); ++i)
{
switch(s)
{
case '(':
{
long count = 1;
std::string::size_type p = i;
for(;;)
{
p = s.find_first_of("()", p+1);
if(std::string::npos==p)return 0; //左右括号不匹配
if('('==s[p])++count;
if(')'==s[p])--count;
if(0==count)break;
}
if(')'!=s[p])return 0;
nums.push_back(calculator(s.substr(i+1,p-i-1)));
s.erase(s.begin()+i, s.begin()+p+1);
--i;
break;
}
case '*':
case '/':
case '+':
case '-':
{
if(('-'==s && nums.empty())
|| ('-'==s && nums.size()==ops.size()))//处理负号
{
strNumber+="-";
break;
}
else
{
if(!strNumber.empty())nums.push_back(string_value<double>(strNumber));
ops.push_back(s);
strNumber="";
break;
}
}
case '0':
if(!strNumber.empty())strNumber+='0';
break;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '.':
strNumber+=s;
break;
default:break;
}
}
if(!strNumber.empty())nums.push_back(string_value<double>(strNumber));
std::cout<<"所有操作数:"<<std::ends;
std::copy(nums.begin(), nums.end(), std: stream_iterator<double, char>(std::cout, " "));
std::cout<<std::endl;
std::cout<<"所有运算符:"<<std::ends;
std::copy(ops.begin(), ops.end(), std::ostream_iterator<char, char>(std::cout, " "));
std::cout<<std::endl;
if(ops.size()+1!=nums.size())return 0;
for(i=0; i<ops.size();)
{
switch(ops)
{
case '*':
{
nums *= nums[i+1];
nums.erase(nums.begin()+i+1);
ops.erase(ops.begin()+i);
break;
}
case '/':
{
nums /= nums[i+1];
nums.erase(nums.begin()+i+1);
ops.erase(ops.begin()+i);
break;
}
default: ++i;
}
}
if(ops.size()+1!=nums.size())return 0;
i=0;
while(nums.size()>1)
{
switch(ops)
{
case '+':
{
nums += nums[i+1];
nums.erase(nums.begin()+i+1);
ops.erase(ops.begin()+i);
break;
}
case '-':
{
nums -= nums[i+1];
nums.erase(nums.begin()+i+1);
ops.erase(ops.begin()+i);
break;
}
}
}
return nums[0];
}
int main()
{
std::cout<<calculator("-5*(5+1)/(-5)*(-2)")<<std::endl;
return 0;
}
|
|