洛谷 P2186 小Z的栈函数

1 篇文章 0 订阅

洛谷 P2186 小Z的栈函数


题目

题目描述

小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 <string>
#include <iostream>
#include <stack>
#define INF 1000000000
#define maxn 2005
using namespace std;

int tot,n,flag;
int a[maxn];
stack<int> stk;
struct des{
    int num;
    string s;
} q[maxn];

void end()
{
    printf("ERROR\n");
}

bool check(int x)
{
    if (x>INF||x<-INF) return true;
     else return false;
}

void num(int x)
{
    if (check(q[x].num)) flag=1;
     else stk.push(q[x].num);
}

void inv()
{
     int x=stk.top();
     if (check(-x)) flag=1;
      else {
        stk.pop();
        stk.push(-x);
      }

}

void dup()
{
    int x=stk.top();
    stk.push(x);
}

void swp()
{
    int x,y;
    x=stk.top();stk.pop();
    y=stk.top();stk.pop();
    if (check(x)||check(y)) flag=1;
     else {
        stk.push(x);stk.push(y);
     }
}

void add()
{
    int x,y;
    x=stk.top();stk.pop();
    y=stk.top();stk.pop();
    if (check(x+y)) flag=1;
     else stk.push(x+y);
}

void sub(){
    int x,y;
    x=stk.top();stk.pop();
    y=stk.top();stk.pop();
    if (check(y-x)) flag=1;
     else stk.push(y-x);
}

void mul()
{
    int x,y;
    x=stk.top();stk.pop();
    y=stk.top();stk.pop();
    if (check(x*y)) flag=1;
     else stk.push(x*y); 
}

void div()
{
    int x,y;
    x=stk.top();stk.pop();
    y=stk.top();stk.pop();
    if (!x||check(y/x)) flag=1;
     else stk.push(y/x);
}

void mod()
{
    int x,y;
    x=stk.top();stk.pop();
    y=stk.top();stk.pop();
    if (!x&&check(y%x)) flag=1;
     else stk.push(y%x);
}

int main(){
    tot=0;
    while(true){
        cin>>q[tot].s;
        if (q[tot].s=="NUM") scanf("%d",&q[tot].num);
        if (q[tot].s=="END") break;
        else tot++;
    }
    scanf("%d",&n);
    for (int i=0;i<n;i++) scanf("%d",&a[i]);
    for (int i=0;i<n;i++){
        while (stk.size()!=0) stk.pop();
        stk.push(a[i]);
        flag=0;
        for (int j=0;j<tot;j++){
            if (check(a[i])){
                flag=1;break;
            }
            if (q[j].s=="NUM") num(j);
            else if (q[j].s=="POP") stk.pop();
            else if (q[j].s=="INV") inv();
            else if (q[j].s=="DUP") dup();
            else if (q[j].s=="SWP") swp();
            else if (q[j].s=="ADD") add();
            else if (q[j].s=="SUB") sub();
            else if (q[j].s=="MUL") mul();
            else if (q[j].s=="DIV") div();
            else if (q[j].s=="MOD") mod();
            if (flag==1) break;
        }
        if (flag==1){
            end();continue;
        }
        if (stk.size()!=1) end();
         else printf("%d\n",stk.top());
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值