zoukankan      html  css  js  c++  java
  • 表达式求值

    数学表达式求值:输入由数字、‘+’,‘—’,‘*’,‘/’,乘方’^’,小括号组成的字符串,输出运算结果;

    使用栈实现。对于括号,预处理每个左括号对应的右括号位置,然后递归处理每个括号.对于判断负数要很小心,万一出现 -(-(-(-1))) 这种情况

    #include<bits/stdc++.h>
    using namespace std;
    const int N=105;
    char s[N];
    int t[N],n;
    unordered_map<char,int>mp;
    void init() {
        scanf("%s",s+1);
        stack<int>tmp;
        n=strlen(s+1);
        for(int i=1; i<=n; ++i) {
            if(s[i]=='(')
                tmp.push(i);
            else if(s[i]==')') {
                t[tmp.top()]=i;
                tmp.pop();
            }
        }
        mp['+']=mp['-']=1;
        mp['*']=mp['/']=2;
        mp['^']=3;
    }
    bool isd(char c) {
        return (c>='0'&&c<='9')?true:false;
    }
    void js(stack<char>&a,stack<double>&b)
    {
        double x=b.top();b.pop();
        double y=b.top();b.pop();
        char c=a.top();a.pop();
        if(c=='+')b.push(y+x);
        if(c=='-')b.push(y-x);
        if(c=='*')b.push(y*x);
        if(c=='/')b.push(y/x);
        if(c=='^')b.push(pow(y,x));
    }
    double dfs(int l,int r) {
        stack<char>s1;
        stack<double>s2;
        double neg=1;
        for(int i=l; i<=r;) {
            if(isd(s[i])) {
                double tmp=0;
                while(isd(s[i]))tmp=tmp*10+(s[i]-'0'),++i;
                if(s[i]=='.') {
                    ++i;
                    double sum=1;
                    while(isd(s[i]))sum/=10,tmp+=sum*(s[i]-'0'),++i;
                }
                tmp*=neg,neg=1;
                s2.push(tmp);
            } else if(s[i]=='(') {
                s2.push(dfs(i+1,t[i]-1));
                i=t[i]+1;
            }
            else {
                if(s[i]=='-'&&isd(s[i+1])&&(i==1||((s[i-1]!=')'&&!isd(s[i-1]))))) {
                    neg=-1,++i;
                    continue;
                }
                if(!s1.empty()) {
                    while(s1.size()&& mp[s1.top()]>= mp[s[i]])js(s1,s2);
                    s1.push(s[i]);
                    }
                else s1.push(s[i]);
                ++i;
                }
            }
        while(s1.size())js(s1,s2);
        return s2.top();
    }
    int main() {
        init();
        printf("%.3lf\n",dfs(1,n));
        return 0;
    }
    
  • 相关阅读:
    数据库四种事务隔离级别
    JAVA自定义查询策略
    JAVA分页工具类
    Git常用指令
    TDH-大数据基础
    TDH-ssh免密登录
    TDH-search汇报理解
    TDH-常见运维指令
    pyecharts 0.5 visualmap 显示精度precision到小数
    14-influence 图机器学习之网络的影响力最大化
  • 原文地址:https://www.cnblogs.com/zzctommy/p/12317169.html
Copyright © 2011-2022 走看看