【洛谷p1981】表達式求值


題前廢話:

咱也不知道咱寫了個什么神奇的代碼導致_rqy都看不明白它是怎么re掉的,

代碼的大致思路是這樣的:對於這樣一個中綴表達式,先轉化成它的后綴表達式的形式,然后利用P1449 后綴表達式 這道題的solution來求解這個式子,但是咱也不知道為啥咱也找不出來為啥,它的所有語句都是可以正常執行的,最后答案也求出來顯示出來了,然后它就停止運行了呢???甚至於return 0(main函數中的)都可以執行呢qwq

貼一下代碼吧,希望大佬們幫忙看一看啊qwq:

#include<bits/stdc++.h>

using namespace std;

int cnt,x,b,c,num;
string a,d;
stack<char> s1;
stack<long long> s;

int main(){
    cin>>a;
    int len=a.size();
    for(int i=0;i<len;i++){
        if(a[i]>='0'&&a[i]<='9'){
            d[cnt++]=a[i];
        }
        else {
            if(a[i]=='+'||a[i]=='-'||a[i]=='*'){
                char f=s1.top();
                d[cnt++]='.';
                if((a[i]=='+'||a[i]=='-')&&(f=='*')){
                    d[cnt++]=f;
                    s1.pop();
                }
                s1.push(a[i]);
            }
        }
    }
    d[cnt++]='.';
    while(!s1.empty()){
        d[cnt++]=s1.top();
        s1.pop();
    }
    for(int i=0;i<cnt;i++){
        if(d[i]=='+'){x=s.top();s.pop();b=s.top();s.pop();c=x+b;s.push(c);}
        if(d[i]=='-'){x=s.top();s.pop();b=s.top();s.pop();c=b-x;s.push(c);}
        if(d[i]=='*'){x=s.top();s.pop();b=s.top();s.pop();c=x*b;s.push(c);}
        if(d[i]>='0'&&d[i]<='9'){
            num*=10;
            num+=(d[i]-'0');
        }
        if(d[i]=='.'&&num!=0) {
            s.push(num);
            num=0;
        }
    }
    cout<<s.top()%10000;
}
View Code

好啦接下來是是正解:

SOLUTION:

首先這個讀入就非常神奇啦誒:先讀入一個數字(顯然這個表達式只有數字和運算符號(+*)沒題目描述沒有-哦),然后讀入就很神奇:

cin>>a;//先讀入一個數字
    a%=10000;
while(ch!='\n'){
        ch=getchar();//然后讀入運算符
        if(ch=='\n') break;//當讀入的運算符是空格,顯然讀入完成了,break掉;
        cin>>b;

然后是思路:

首先也像轉后綴表達式一樣,建立一個stack(直接用stl了比較好寫(不會手寫)),將數字入棧,這里的操作是:如果讀入的操作符是‘*’,那么將一個元素出棧,然后接下來會繼續讀入一個數字b嘛,將a*b%mod的值再放進棧中,這樣只要是在棧中的數就只會進行加法運算而不會進行乘法運算,這樣就保證了優先級;

最后把棧中所有的元素取出相加即為答案

CODE:

#include<bits/stdc++.h>

using namespace std;

long long a,b,ans;
char ch;
stack<long long> s;

int main(){
    cin>>a;
    a%=10000;
    s.push(a);
    while(ch!='\n'){
        ch=getchar();
        if(ch=='\n') break;
        cin>>b;
        if(ch=='*'){
            a=s.top();
            s.pop();
            s.push(a*b%10000);
        }
        else s.push(b);
    }
    while(s.size()){
        ans=(ans+s.top())%10000;
        s.pop();
    }
  cout<<ans%10000<<endl;
}

end-


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM