题解 P1175 【表达式的转换】

· · 题解

首先中转后; 之后放在数组里处理; 输出时可以尝试映射; 上代码:

#include<bits/stdc++.h>
using namespace std;
stack<char> s,out;
char yun[1000];
int number[1000];
int main()
{
//  freopen("test.txt","r",stdin);
    string ms;
    cin>>ms;
    int i=-1;int op=0;
    while(ms[++i]) {
        //cout<<"in"<<i<<endl;
        if(ms[i]>='0' && ms[i]<='9') {
            out.push(ms[i]);
            continue;
        }
        if(ms[i] == '(') {
            s.push(ms[i]);
            continue;
        }
        if(ms[i] ==')') {
            while(s.top()!='(') {
                char n=s.top();
                s.pop();
                out.push(n);
            }
            s.pop();
            continue;
        }
        if(ms[i] == '^') {
            while(s.size() && s.top() == '^') {
                char n = s.top();
                out.push(n);
                s.pop();
            }
            s.push(ms[i]);
            ++op;
            continue;
        }
        if(ms[i] == '*' || ms[i] == '/') {
            while(s.size() && (s.top() == '*' || s.top() == '/'||s.top() == '^')) {
                char n = s.top();
                out.push(n);
                s.pop();
            }
            s.push(ms[i]);
            ++op;
            continue;
        }
        if(ms[i] == '+' || ms[i] == '-') {
            while(s.size() && s.top()!='(') {
                char n = s.top();
                out.push(n);
                s.pop();
            }
            s.push(ms[i]);
            ++op;
        }
    }
    while(s.size()) {
        char n = s.top();
        out.push(n);
        s.pop();
    }
    int z=-1;
    while(out.size()) {
        char n = out.top();
        yun[++z]=n;
        if(yun[z]>='0'&&yun[z]<='9') {
            number[z]=yun[z]-'0';
            yun[z]='@';
        }
        out.pop();
    }
    int num;++op;
    while(op--) {
        num = strlen(yun);
    //  cout<<"num"<<num<<" ";
        for(int i = num-1; i>=0; i--) {
            if(yun[i] == '@')
            cout<<number[i]<<" ";
            else if(yun[i] == '$')
            continue;
            else
            cout<<yun[i]<<" ";
        }
        cout<<endl;
/*      for(int i = num-1; i>=0; i--) {
            cout<<yun[i]<<" ";
        }
        cout<<endl;*/
        if(num>1) {
            for(int i = num-1; i>=0; i--) {
                int j=i,f=0;
                switch(yun[i]) {
                    case '+':{
                        yun[i]='$';
                        for(;;j++) {
                            if(yun[j] == '@')
                            break;
                        }
                        int a1=number[j];
                        yun[j]='$';
                        ++j;
                        for(;;j++) {
                            if(yun[j] == '@')
                            break;
                        }
                        number[j]+=a1;
                        f=1;
                        break;
                    }

                    case '-':{
                            yun[i]='$';
                        for(;;j++) {
                            if(yun[j] == '@')
                            break;
                        }
                        int a1=number[j];
                        yun[j]='$';
                        ++j;
                        for(;;j++) {
                            if(yun[j] == '@')
                            break;
                        }
                        number[j]-=a1;
                        f=1;
                        break;
                    }

                    case '*':{
                            yun[i]='$';
                        for(;;j++) {
                            if(yun[j] == '@')
                            break;
                        }
                        int a1=number[j];
                        yun[j]='$';
                        ++j;
                        for(;;j++) {
                            if(yun[j] == '@')
                            break;
                        }
                        number[j]*=a1;
                        f=1;
                        break;
                    }

                    case '/':{
                            yun[i]='$';
                        for(;;j++) {
                            if(yun[j] == '@')
                            break;
                        }
                        int a1=number[j];
                        yun[j]='$';
                        ++j;
                        for(;;j++) {
                            if(yun[j] == '@')
                            break;
                        }
                        number[j]/=a1;
                        f=1;
                        break;
                    }

                    case '^':{
                            yun[i]='$';
                        for(;;j++) {
                            if(yun[j] == '@')
                            break;
                        }
                        int a1=number[j];
                        yun[j]='$';
                        ++j;
                        for(;;j++) {
                            if(yun[j] == '@')
                            break;
                        }
                        int s=1;
                        while(a1--) {
                            s*=number[j];
                        }
                        number[j]=s;
                        f=1;
                        break;
                    }
                }
                if(f)break;
            }
        }
    //  if(s== 2)break;
    }

    return 0;
}