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下安装vsftp
    CentOS 7.0编译安装Nginx1.6.0+MySQL5.6.19+PHP5.5.14
    Centos编译安装PHP 5.5笔记
    centos使用更新更快的yum源
    使用Android Studio搭建Android集成开发环境
    设计模式(三)原型模式
    overridePendingTransition
    Android手势密码实现
    UserInfoActivity用户图像修改和退出登录
    设计模式(二)建造者模式
  • 原文地址:https://www.cnblogs.com/tsj816523/p/11802111.html
Copyright © 2011-2022 走看看