某公司的笔试题,做出来还是花了点时间 用比较笨的方法
/*************************************************************************
> File Name: numstr_calculate.cpp
> Author: chunquanL
> Created Time: 2017-03-22
************************************************************************/
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
//计算字符串运算的结果
//(10.5*((1+4/2)-5+(9+1)))/2.0
int isnum(char ch)
{
if(ch=='.')
return 1;
return ('0'<=ch && '9'>=ch)?1:0;
}
double myatof(const char *str,int *len)
{
double result=0;
double base =0.1;
int length=0;
int i=0;
for(int j=0;isnum(str[j]);j++)
length++;
*len = length;
while(i<length && str[i]!='.')
{
result*=10;
result += str[i]-'0';
i++;
}
if(i<length && str[i]=='.')
{
i++;
}
while(i<length)
{
result += (str[i]-'0')*base;
i++;
base*=0.1;
}
for(int i=0;i<length;i++)
{
}
return result;
}
double getResult_normal(vector<double> &num,vector<char> &sign,int start,int end)
{
//首先处理乘除法
int num_of_handle1=0; //乘除运算次数
int num_of_handle2=0; //加减运算次数
double result;
for(int i=start;i<=end;i++)
{
if(sign[i]=='*' || sign[i]=='/')
num_of_handle1++;
if(sign[i]=='+' || sign[i]=='-')
num_of_handle2++;
}
while(num_of_handle1)
{
int i;
for(i=start;i<=end;i++)
{
if(sign[i]=='*' || sign[i]=='/')
break;
}
int before = i;
int next = i;
double res=0;
while(sign[--before]!='n');
while(sign[++next]!='n');
if(sign[i] == '*')
res = num[before]*num[next];
else if(sign[i]=='/')
res = num[before]/num[next];
sign[before]=' ';
sign[next] = ' ';
sign[i] = 'n';
num[i] = res;
num_of_handle1--;
}
while(num_of_handle2)
{
int i;
for(i=start;i<=end;i++)
{
if(sign[i]=='+' || sign[i]=='-')
break;
}
int before = i;
int next = i;
double res=0;
while(sign[--before]!='n');
while(sign[++next]!='n');
if(sign[i] == '+')
res = num[before]+num[next];
else if(sign[i]=='-')
res = num[before]-num[next];
sign[before]=' ';
sign[next] = ' ';
sign[i] = 'n';
num[i] = res;
result = res;
num_of_handle2--;
}
return result;
}
double getResult(char *expr,int length)
{
if(!expr)
return 0;
vector<double> num;
vector<char> sign;
for(int i=0;i<length;)
{
if(isnum(expr[i]))
{
int len=0;
double res = myatof(&expr[i],&len);
i+=len;
num.push_back(res);
sign.push_back('n');
}
else
{
sign.push_back(expr[i]);
i++;
num.push_back(0.0);
}
}
/*
for(int i=0;i<num.size();i++)
cout<<num[i]<<" ";
cout<<endl;
for(int i=0;i<sign.size();i++)
cout<<sign[i]<<" ";
cout<<endl;
*/
//先解决括号
int num_of_kuohao = 0;
for(int i=0;i<length;i++)
{
if(sign[i]=='(')
num_of_kuohao++;
}
if(num_of_kuohao)
{
while(num_of_kuohao)
{
//找到最后面那个括号的位置
int before=0;
int cnt=0;
for(before=0;before<length;before++)
{
if(sign[before]=='(')
++cnt;
if(cnt==num_of_kuohao)
break;
}
//找到后面的第一个括号
int next = before;
for(;next<length;next++)
{
if(sign[next]==')')
break;
}
getResult_normal(num,sign,before+1,next-1);
sign[before] = ' ';
sign[next] =' ';
num_of_kuohao--;
}
}
getResult_normal(num,sign,0,length-1);
// cout<<getResult_normal(num,sign,0,num.size()-1);
double res=0;
for(int i=0;i<length;i++)
{
if(sign[i]=='n')
res=num[i];
}
return res;
}
int main(void)
{
/* char a[]="0.12121";
int len;
cout<<myatof(a,&len)<<endl;
cout<<len<<endl;
cout<<isnum('8');
cout<<1*1+2*3/4;
*/
char str[] = "((1.0+2.3)*2)+3/2*(6-5.9)";
for(int i=0;i<strlen(str);i++)
cout<<str[i];
cout<<endl;
cout<<getResult(str,strlen(str))<<endl;
return 0;
}