浙江财经大学
信工学院ACM集训队

计算中缀表达式的值

本文由 Ocrosoft 于 2016-04-27 10:45:33 发表
实现表达式求解
输入:
(56-20)/(4+2)
输出:
6
Solution:上一篇已经将中缀表达式转换成了后缀表达式,这里把那个后缀表达式进行求值。
(Trans函数根上一篇的不一样,不用空格分开字符,每个数字后面加“#”)

#include <cstdio>
#include <iostream>
#include <stack>
#include <string>
#include <cstring>
using namespace std;
stack<char> sop;
char s[1200],postexp[1200];
double res;
void Trans()
{
    while(!sop.empty())
        sop.pop();
    int i=0,j=0;
    char ch;
    while(s[i])
    {
        ch=s[i];
        if(ch=='(')
            sop.push(ch);
        else if(ch==')')
        {
            while(!sop.empty()&&sop.top()!='(')
            {
                postexp[j++]=sop.top();
                sop.pop();
            }
            sop.pop();
        }
        else if(ch=='+'||ch=='-')
        {
            while(!sop.empty()&&sop.top()!='(')
            {
                postexp[j++]=sop.top();
                sop.pop();
            }
            sop.push(ch);
        }
        else if(ch=='*'||ch=='/')
        {
            while(!sop.empty()&&sop.top()!='('&&(sop.top()=='*'||sop.top()=='/'))
            {
                postexp[j++]=sop.top();
                sop.pop();
            }
            sop.push(ch);
        }
        else
        {
            while(ch>='0'&&ch<='9')
            {
                postexp[j++]=ch;
                i++;
                if(s[i])ch=s[i];
                else break;
            }
            i--;
            postexp[j++]='#';
        }
        i++;
    }
    while(!sop.empty())
    {
        postexp[j++]=sop.top();
        sop.pop();
    }
    postexp[j++]='\0';
}
bool solve()
{
    stack<double> st;
    double a,b,c,d;
    int i=0;
    char ch;
    int len=strlen(postexp);
    while(i<len)
    {
        ch=postexp[i];
        switch(ch)
        {
        case '+':
            a=st.top(),st.pop();
            b=st.top(),st.pop();
            c=b+a;
            st.push(c);
            break;
        case '-':
            a=st.top(),st.pop();
            b=st.top(),st.pop();
            c=b-a;
            st.push(c);
            break;
        case '*':
            a=st.top();
            st.pop();
            b=st.top();
            st.pop();
            c=b*a;
            st.push(c);
            break;
        case '/':
            a=st.top(),st.pop();
            b=st.top(),st.pop();
            if(a!=0)
            {
                c=b/a;
                st.push(c);
            }
            else return false;
            break;
        default:
            d=0;
            while(ch>='0'&&ch<='9')
            {
                d=10*d+(ch-'0');
                i++;
                ch=postexp[i];
            }
            st.push(d);
        }
        i++;
    }
    res=st.top();
    return true;
}
int main()
{
    cin>>s;
    Trans();
    if(solve())
        cout<<res<<endl;
    else
        cout<<"不能除以0!\n";
    return 0;
}

欢迎转载,请保留出处与链接。Ocrosoft » 计算中缀表达式的值

点赞 (0)or拍砖 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址