zoukankan      html  css  js  c++  java
  • 简单计算器

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

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

      

  • 相关阅读:
    【Salesfoece】Apex基础数据类型
    【Javascript】Redux ,Saga关系
    【CSS】选择器
    爬取取百度和Flickr图像
    hadoop系列之一问题锦集
    进行数据清洗_在进行大数据分析之前都需要进行数据清洗,如何进行数据清洗?...
    Hadoop中文编码乱码相关问题
    Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/
    解决:Multiple annotations found at this line:
    HttpServletRequest cannot be resolved to a type解决方案
  • 原文地址:https://www.cnblogs.com/Json-Five/p/9756411.html
Copyright © 2011-2022 走看看