zoukankan      html  css  js  c++  java
  • 洛谷 2186 小Z的栈函数

    https://www.luogu.org/problem/show?pid=2186

    题目描述

    小Z最近发现了一个神奇的机器,这个机器的所有操作都是通过维护一个栈来完成的,它支持如下11个操作:

    NUM X:栈顶放入X。

    POP:抛弃栈顶元素。

    INV:将栈顶元素取出,然后放入它的相反数。

    DUP:再放入一个和栈顶元素相同的数。

    SWP:交换栈顶的两个元素。

    ADD:取出栈顶的两个元素,两元素相加,所得结果放入栈内。

    SUB:取出栈顶的两个元素,第二个元素减去第一个元素,所得结果放入栈内。

    MUL:取出栈顶的两个元素,两元素相乘,所得结果放入栈内。

    DIV:取出栈顶的两个元素,第二个元素整除以第一个元素,所得结果放入栈内。

    MOD:取出栈顶的两个元素,第二个元素取模以第一个元素,所得结果放入栈内。

    END:结束这个程序。

    然后,小Z用上面的11种操作写了一个一元函数f(x)。x就是放入栈里面第一个初始元素。然后经过这个函数的一系列操作,当函数结束的时候,正常情况下,栈里面会有唯一的一个元素。剩下的这个元素就作为函数f(x)的返回值。

    小Z有N个询问,询问每个值x经过上述函数所映射出的f(x)是多少。但是这个由于机器太老了,跑起东西来太慢了,小Z又是一个急性子,所以请你们写一个程序,来帮助小Z计算他查询的f(x)。

    输入输出格式

    输入格式:

    输入若干行,仅包含上述11个操作,用来描述函数f(x)的操作,函数的结束保证以END结尾;

    接下来一个整数N;

    下面N行每行一个数字ai,代表栈里面的初始元素。

    输入数据不保证合法!!!

    输出格式:

    如果最后栈内不是一个元素,输出“ERROR”;

    还有,由于这台机器太破了,所以如果运算过程中有数字的绝对值大于1000000000机器也输出“ERROR”;

    如果输入数据不合法,导致中途退出,输出“ERROR”;

    否则输出对应的f(x)。

    输入输出样例

    输入样例#1: 复制
    NUM 600000000
    ADD
    END
    3
    0
    600000000
    1
    输出样例#1: 复制
    600000000
    ERROR
    600000001

    说明

    【提示】

    仔细考虑不合法的情况,避免不必要的RE和WA。

    【数据规模】

    函数操作步数<=2000

    询问数<=2000

    非常水的模拟

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    #define N 2011
    
    #define inf 1000000000
    
    typedef long long LL;
    
    char s[N][5];
    int num[N];
    
    int t;
    
    int st[N],top;
    
    void read(int &x)
    {
        x=0; int f=1; char c=getchar();
        while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); }
        while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
        x*=f;
    }
    
    void work(int x)
    {
        st[top=1]=x;
        for(int i=1;i<t;i++)
        {
            if(s[i][0]=='N') 
            {
                if(num[i]>inf) { printf("ERROR
    "); return; }
                st[++top]=num[i];
            }
            else if(s[i][0]=='P') 
            {
                if(!top)  { printf("ERROR
    "); return; }
                top--;
            }
            else if(s[i][0]=='I') 
            {
                if(!top)  { printf("ERROR
    "); return; }
                st[top]=-st[top];
            }
            else if(s[i][0]=='D' && s[i][1]=='U') 
            {
                if(!top)  { printf("ERROR
    "); return; }
                st[++top]=st[top-1];
            }
            else if(s[i][0]=='S' && s[i][1]=='W')
            {
                if(top<2) { printf("ERROR
    "); return; }
                swap(st[top],st[top-1]);
            }
            else if(s[i][0]=='A')
            {
                if(top<2 || abs(st[top]+st[top-1])>inf) { printf("ERROR
    "); return; }
                st[--top]+=st[top+1];
            }
            else if(s[i][0]=='S')
            {
                if(top<2 || abs(st[top-1]-st[top]>inf)) { printf("ERROR
    "); return; }
                st[--top]-=st[top+1];
            }
            else if(s[i][0]=='M' && s[i][1]=='U')
            {
                if(top<2 || abs(1ll*st[top-1]*st[top]>inf)) { printf("ERROR
    "); return; }
                st[--top]*=st[top+1];
            }
            else if(s[i][0]=='D')
            {
                if(top<2 || !st[top])  { printf("ERROR
    "); return; }
                st[--top]/=st[top+1];
            }
            else if(s[i][0]=='M')
            {
                if(top<2 || !st[top]) { printf("ERROR
    "); return; }
                st[--top]%=st[top+1];
            }
        }
        if(top>1)  printf("ERROR
    "); 
        else printf("%d
    ",st[top]);
        return; 
    }
    
    int main()
    {
        while(1)
        {
            scanf("%s",s[++t]);
            if(s[t][0]=='E') break;
            if(s[t][0]=='N') scanf("%d",&num[t]);
        }
        int n,x;
        read(n);
        while(n--) read(x),work(x);
    }
  • 相关阅读:
    写在开篇——过往总结
    线程池原理实现
    MD5加密工具类
    跨域及jsonp
    四种xml的解析方式
    浅析正则表达式—(原理篇)
    用JavaScript添加选择按钮的背景颜色和juqery添加选择按钮的背景色
    怎么用JavaScript实现tab切换
    vue.js2.0:如何搭建开发环境及构建项目
    vscode如何用浏览器预览运行html文件
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/7710911.html
Copyright © 2011-2022 走看看