• 【洛谷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!='
    '){
            ch=getchar();//然后读入运算符
            if(ch=='
    ') 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!='
    '){
            ch=getchar();
            if(ch=='
    ') 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-

  • 相关阅读:
    正则表达式
    iOS设置图片名称、启动图片、防止TabBar图片和文字渲染
    UIImageView中的UIButton不响应事件解决方案
    iOS 适配https
    【如何快速的开发一个完整的iOS直播app】(美颜篇)
    【如何快速的开发一个完整的iOS直播app】(采集篇)
    【如何快速的开发一个完整的iOS直播app】(播放篇)
    【如何快速的开发一个完整的iOS直播app】(原理篇)
    iOS10字体
    AFN 无网络监控
  • 原文地址:https://www.cnblogs.com/zhuier-xquan/p/11040665.html
Copyright © 2020-2023  润新知