UOJ Logo insilent的博客

博客

写的超麻烦的计算

2018-02-23 05:22:11 By insilent

正如大家所知,栈是一个LIFO

于是表达式计算就是栈的任务了


思路:

中缀转后缀

然后再计算


PS:

其实两个子程序能合成一个

也就是边转变算

大家就自己写出来吧

1519362662x-1404817587.jpg


#include<bits/stdc++.h>
using namespace std ;
string turn(string bds)
{
    stack<char> ustore;
    int len=bds.size();
    char rate,tmp;
    string result="";
    for(int i=0;i<len;i++)
    {
        rate=bds[i];
        switch(rate)
        {
            case ' ':
                break;
            case '(':
                ustore.push(rate);
                break;
            case '+':
            case '-':
                while(!ustore.empty())
                {
                    tmp=ustore.top();
                    ustore.pop();
                    if(tmp=='(')
                    {
                        ustore.push('(');
                        break;
                    }
                    result+=tmp;

                }
                ustore.push(rate);
                result+=" ";
                break;
            case '*':
            case '/':
                while(!ustore.empty())
                {
                    tmp=ustore.top();
                    ustore.pop();
                    if(tmp=='('||tmp=='+'||tmp=='-')
                    {
                        ustore.push(tmp);
                        break;
                    }
                    result+=tmp;
                    result+=" ";
                }
                ustore.push(rate);
                result+=" ";
                break;
            case '^':
                while(!ustore.empty())
                {
                    tmp=ustore.top();
                    ustore.pop();
                    if(tmp=='('||tmp=='+'||tmp=='-'||tmp=='*'||tmp=='/')
                    {
                        ustore.push(tmp);
                        break;
                    }
                    result+=tmp;
                    result+=" ";
                }
                ustore.push(rate);
                result+=" ";
                break;
            case ')':
                while(!ustore.empty())
                {
                    tmp=ustore.top();
                    ustore.pop();
                    if(tmp=='(')
                        break;
                    result+=tmp;
                    result+=" ";
                }
                break;
            default:
                result+=rate;
        }
    }
    while(!ustore.empty())
    {
        result+=ustore.top();
        result+=" ";
        ustore.pop();
    }
    return result;
}
int ucalculate(string ss)
{
    string s=turn(ss);
    char c;
    stack <int> num;
    num.push(0);
    int d1,d2,dr;
    int k=0;
    int shu=0;

    while(k<s.size())
    {
        c=s[k++];
        if(c=='+'||c=='-'||c=='*'||c=='/'||c=='^')
        {
            switch(c)
            {
                case '+':
                    d2=num.top();  num.pop();
                    d1=num.top();  num.pop();
                    dr=d1+d2;
                    num.push(dr);
                    break;
                case '-':
                    d2=num.top();  num.pop();
                    d1=num.top();  num.pop();
                    dr=d1-d2;
                    num.push(dr);
                    break;
                case '*':
                    d2=num.top();  num.pop();
                    d1=num.top();  num.pop();
                    dr=d1*d2;
                    num.push(dr);
                    break;
                case '/':
                    d2=num.top();  num.pop();
                    d1=num.top();  num.pop();
                    dr=d1/d2;
                    num.push(dr);
                    break;
                case '^':
                    d2=num.top();  num.pop();
                    d1=num.top();  num.pop();
                    dr=pow(d1,d2);
                    num.push(dr);
                    break;
            }
        }
        if(c>='0'&&c<='9')
        {
            while(c>='0'&&c<='9')
            {
                shu*=10;
                shu+=c-'0';
                c=s[k++];
            }
            k--;
            d1=shu;
            num.push(d1);
            shu=0;
        }
    }
    return num.top();
}
int main()
{
    string s;
    cin>>s;
    cout<<ucalculate(s);
}

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。