• 简单计算器


    支持括号,浮点运算,需要输入一串 运算表达式 后面加一个#

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

      

  • 相关阅读:
    微分中值定理和泰勒展开
    Burnside引理与Polya定理
    递推关系和母函数
    cogs 1361. 树 线段树
    cogs 247. 售票系统 线段树
    cogs 176. [USACO Feb07] 奶牛聚会 dijkstra
    cogs 1672. [SPOJ 375] 难存的情缘 树链剖分套线段树 易错! 全博客园最长最详细的题解
    cogs 886. [USACO 4.2] 完美的牛栏 二分图 匈牙利算法
    cogs 1254. 最难的任务 Dijkstra + 重边处理
    cogs 364. [HDU 1548] 奇怪的电梯 Dijkstra
  • 原文地址:https://www.cnblogs.com/Json-Five/p/9756411.html
Copyright © 2020-2023  润新知