表达式求值

#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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值