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\n",OPND.top());
        OPND.pop();
        getchar();
    }
    return 0;
}

重点大概在于数据接收

posted @ 2019-11-05 22:14  洛枫大人  阅读(723)  评论(0编辑  收藏  举报