zoukankan      html  css  js  c++  java
  • C++练习 | 基于栈的中缀算术表达式求值(double类型

    #include<iostream>
    #include<stack>
    #include<cmath>
    using namespace std;
    char ch;
    
    bool f(char t)
    {
        if(t=='+'||t=='-'||t=='*'||t=='/'||t=='('||t==')'||t=='=')
            return 1;
        return 0;
    }
    
    double cal(double t1,double t2,char c)
    {
        switch(c)
        {
            case '+':return t1+t2;
            case '-':return t1-t2;
            case '*':return t1*t2;
            case '/':return t1/t2;
        }
        return 0;
    }
    
    int cmp(char t1,char t2)
    {
        int q1=0,q2=0;
        switch(t1)
        {
            case '+':q1=1;break;
            case '-':q1=1;break;
            case '*':q1=2;break;
            case '/':q1=2;break;
            case '(':q1=0;break;
            case ')':q1=-1;break;
        }
        switch(t2)
        {
            case '+':q2=1;break;
            case '-':q2=1;break;
            case '*':q2=2;break;
            case '/':q2=2;break;
            case '(':q2=0;break;
            case ')':q2=-1;break;
        }
        if(q1==-1&&q2==0)
            return 0;
        if(q1>q2)
            return 2;
        if(q1<=q2)
            return 1;
        return -1;
    }
    
    double z()
    {
        double ans=0;
        int a[1000],i=0,flag=0;
        a[++i]=ch-'0';
        while(cin>>ch&&!f(ch))
        {
            if(ch=='.')
            {
                flag=i;
                continue;
            }
            a[++i]=ch-'0';
        }
        if(flag==0)
            flag=i;
        for(int j=1;j<=i;j++)
        {
            ans+=a[j]*pow(10,flag-j);
        }
        return ans;
    }
    
    int main()
    {
        stack<double> OPND;//存放数字
        stack<char> OPTR;//存放运算符
        double t1,t2,t3;
        while(cin>>ch&&ch!='=')
        {
            if(f(ch))
            {
                OPTR.push(ch);
                cin>>ch;
            }
            else
            {
                OPND.push(z());
            }
            while(ch!='=')
            {
                if(f(ch))
                {
                    if(OPTR.empty())
                    {
                        OPTR.push(ch);
                        cin>>ch;
                        continue;
                    }
                    if(cmp(ch,OPTR.top())==1)//后出现的优先级小,存储
                    {
                        OPTR.push(ch);
                        cin>>ch;
                        continue;
                    }
                    else if(cmp(ch,OPTR.top())==2)//后出现的优先级大,计算
                    {
                        char c1=ch;
                        cin>>ch;
                        t2=z();
                        t1=OPND.top();
                        OPND.pop();
                        t3=cal(t1,t2,c1);
                        OPND.push(t3);
                    }
                    else
                    {
                        OPTR.pop();
                        cin>>ch;
                    }
                }
                else
                {
                    OPND.push(z());
                }
            }
            while(!OPTR.empty())
            {
                ch=OPTR.top();
                OPTR.pop();
                t2=OPND.top();
                OPND.pop();
                t1=OPND.top();
                OPND.pop();
                t3=cal(t1,t2,ch);
                OPND.push(t3);
            }
            printf("%.2lf
    ",OPND.top());
            OPND.pop();
            getchar();
        }
        return 0;
    }

    重点大概在于数据接收

  • 相关阅读:
    管理员必备的Linux系统监控工具
    kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
    RedHat linux配置yum本地资源
    RedHat Linux RHEL6配置本地YUM源
    c语言中的fgets函数
    sprintf()函数的用法
    spring boot整合JWT例子
    spring boot 自定义过滤器链
    (转)ArrayList和LinkedList的几种循环遍历方式及性能对比分析
    (转)Springboot 中filter 注入对象
  • 原文地址:https://www.cnblogs.com/tsj816523/p/11802111.html
Copyright © 2011-2022 走看看