简单计算器
支持括号,浮点运算,需要输入一串 运算表达式 后面加一个#
#include<bits/stdc++.h>
using namespace std;
char pre[7][7]=
{
'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','<',
'>','>','>','>','>','>','>',
'<','<','<','<','<','<','=',
};
stack<double>oprn;
stack<char>optr;
bool isOprn(char ch)
{
if(ch>='0'&&ch<='9'||ch=='.')
return true;
return false;
}
double compute(double a,double b,char c)
{
switch(c)
{
case '+':
return a+b;
break;
case '-':
return a-b;
break;
case '*':
return a*b;
break;
case '/':
return a/b;
break;
}
}
int getIndex(char c)
{
switch(c)
{
case '+':
return 0;
break;
case '-':
return 1;
break;
case '*':
return 2;
break;
case '/':
return 3;
break;
case '(':
return 4;
break;
case ')':
return 5;
break;
case '#':
return 6;
break;
}
}
double calculate(string str)
{
while(!oprn.empty())oprn.pop();
while(!optr.empty())optr.pop();
optr.push('#');
int flag=0,lefti,righti,i=0,opli,opri;;
double opnl,opnr;
while(!optr.empty())
{
if(flag==0&&(isOprn(str[i])||(i==0||str[i-1]=='(')&&str[i]=='-'&&isOprn(str[i+1])))
{
lefti=i;
flag=1;
}
else if(!isOprn(str[i]))
{
if(flag==1)
{
righti=i;
stringstream num(str.substr(lefti,righti-lefti));
num>>opnl;
oprn.push(opnl);
flag=0;
}
opri=getIndex(str[i]);
opli=getIndex(optr.top());
while(1)
{
if(pre[opli][opri]=='<')
{
optr.push(str[i]);
break;
}
else if(pre[opli][opri]=='>')
{
char op=optr.top();
optr.pop();
opnr=oprn.top();
oprn.pop();
opnl=oprn.top();
oprn.pop();
oprn.push(compute(opnl,opnr,op));
opli=getIndex(optr.top());
}
else if(pre[opli][opri]=='=')
{
optr.pop();
break;
}
}
}
i++;
}
double ans=oprn.top();
oprn.pop();
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
string str;
cin>>str;
cout<<setprecision(4)<<fixed<<calculate(str)<<endl;
}
return 0;
}

浙公网安备 33010602011771号