#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
#include<vector>
#include<set>
using namespace std;
string getstr(char str[])//处理字符串中的空格和最后的等号,还有字符串中的负号
{
int len=strlen(str);
string a;
for(int i=0; i<len; i++)
if(str[i]!=' '&&str[i]!='=')
a+=str[i];
len=a.size();
string s;//处理负号
if(a[0]=='-')
s+='#';
else
s+=a[0];
for(int i=1; i<len; i++)
{
if(a[i]=='-'&&(a[i-1]!=')'&&(a[i-1]<='0'||a[i-1]>='9')))
s+='#';
else
s+=a[i];
}
return s;
}
int judge(char a)//返回运算符的优先级
{
if(a=='#')
return 3;
else if(a=='*'||a=='/')
return 2;
else if(a=='+'||a=='-')
return 1;
else if(a=='(')
return 0;
}
void operate(stack<double> &number,char s)//运算符计算
{
double a,b;
if(s=='#')
{
a=0-number.top();
number.push(a);
}
else if(s=='+')
{
a=number.top();
number.pop();
b=number.top();
number.pop();
number.push(a+b);
}
else if(s=='-')
{
a=number.top();
number.pop();
b=number.top();
number.pop();
number.push(b-a);//注意是后面减前面
}
else if(s=='*')
{
a=number.top();
number.pop();
b=number.top();
number.pop();
number.push(a*b);
}
else if(s=='/')
{
a=number.top();
number.pop();
b=number.top();
number.pop();
number.push(b/a);//后面除前面
}
}
double getans(string str)//字符串处理
{
int len=str.size();
stack<double> number;//数字栈
stack<char> q;//运算符栈
for(int i=0; i<len; i++)
{
if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='#')
{
if(q.empty())
q.push(str[i]);
else
{
char flag=q.top();
if(judge(str[i])>judge(flag))//优先级高入栈
q.push(str[i]);
else
{
while(judge(str[i])<=judge(flag))//优先级低,运算栈顶运算符
{
operate(number,flag);
q.pop();
if(q.size()>0)
flag=q.top();
else
break;
}
q.push(str[i]);//高等级运算符入栈
}
}
}
else if(str[i]=='(')
q.push(str[i]);
else if(str[i]==')')//处理到左括号
{
while(q.top()!='(')
{
char flag=q.top();
operate(number,flag);
q.pop();
}
q.pop();
}
else
{
string a;
for(;i<len; i++)//把字符串转换为数字
{
if(str[i]!='.'&&(str[i]<'0'||str[i]>'9'))
{
i--;
break;
}
else
a+=str[i];
}
number.push(atof(a.c_str()));//数字入栈
}
}
while(q.size()!=0)//处理完运算符栈
{
operate(number,q.top());
q.pop();
}
return number.top();//返回数字栈的最终值
}
int main()
{
// freopen("Input.txt","r",stdin);
//freopen("Output.txt","w",stdout);
int ncase;
scanf("%d",&ncase);
getchar();
while(ncase--)
{
char a,s[1010];
int i;
for(i=0;; i++)//读入字符串
{
if(scanf("%c",&a)==EOF) break;//文件结束跳出
if(a=='\n')
break;
s[i]=a;
}
s[i]='\0';
string str=getstr(s);//处理空格,等号,负号
double ans=getans(str);//得到表达式值
printf("%.2lf\n",ans);
}
}
表达式求值
最新推荐文章于 2024-08-10 16:43:58 发布