洛谷 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;
}

洛谷 P2186 小Z的栈函数相关推荐

  1. 洛谷 P2191 小Z的情书

    题目背景 众所周知,小Z是高富帅的典范和代表,所以他很很多很多的妹纸.小Z要写情书给他的妹纸了,作为一个谨慎的人,他当然不会直白的写在纸上(否则被那群损友发现岂不糟了?). 题目描述 虽然小Z谨小慎微 ...

  2. 2017提高组D1T1 洛谷P3951 小凯的疑惑

    洛谷P3951 小凯的疑惑 原题 题目描述 小凯手中有两种面值的金币,两种面值均为正整数且彼此互素.每种金币小凯都有 无数个.在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的.现在小 凯想 ...

  3. 洛谷 P4430 小猴打架

    洛谷 P4430 小猴打架 题目描述 一开始森林里面有N只互不相识的小猴子,它们经常打架,但打架的双方都必须不是好朋友.每次打完架后,打架的双方以及它们的好朋友就会互相认识,成为好朋友.经过N-1次打 ...

  4. 信息学奥赛一本通 1924:【03NOIP普及组】栈 | 洛谷 P1044 [NOIP2003 普及组] 栈

    [题目链接] ybt 1924:[03NOIP普及组]栈 洛谷 P1044 [NOIP2003 普及组] 栈 [题目考点] 递推.递归 栈 [解题思路]:一维递推 设数组a,a[i]表示i个数组成的数 ...

  5. (最小割)洛谷P1361 小M的作物

    洛谷P1361 小M的作物 思路: 这是一个两者取一的模型,将点集一分为二. 最小割在数值上等同于最大流.割去权值和最小的边,使图分成两部分,割下来的边权值和为最小割. 对于此题,先不考虑种在一起的情 ...

  6. 【01背包求方案数模板】洛谷 P1164 小A点菜

    洛谷 P1164 小A点菜 https://www.luogu.org/problemnew/show/P1164 题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家--餐馆, ...

  7. 洛谷[P1120 小木棍]

    洛谷[P1120 小木棍] 题目: 思路: 枚举小木棒可能的长度,从数组最大值开始枚举,这个值能被总长度整除才是可行的 在使用dfs枚举小木棒的每一种可能,如果不可能就找下一个可能的长度开始枚举 注意 ...

  8. 洛谷-P1125-笨小猴

    [NOIP2008 提高组] 笨小猴 - 洛谷 解题思路: 1.由题可得,输入一个只包含字母的字符串,那么用string str 来表示,判断里面字母出现最多的次数和最少的次数,max和min 2.如 ...

  9. 洛谷P2257 YY的GCD 莫比乌斯函数反演+线性筛

    洛谷P2257 YY的GCD 标签 莫比乌斯反演 线性筛 前言 这题貌似和莫反没多大关系,就是用到了一个莫比乌斯函数的性质了,其他就是推公式,优化和式. 我的第一道懵逼反演-真的好难好难-而且套路特别 ...

最新文章

  1. 使用PyTorch时,最常见的4个错误
  2. HUD 5687(字典树)
  3. java连连看(GUI)
  4. 启动一个线程是用run()还是start()?
  5. nginx服务器配置/websocket nginx 配置笔记
  6. iOS判断是模拟器还是真机
  7. 史上最贵黑客事件!中本聪用代码亲手杀死 1844.67 亿枚比特币!
  8. Linux eBPF和XDP高速处理数据包;使用EBPF编写XDP网络过滤器;高性能ACL
  9. 输入234输出432的c语言程序,C程序设计第1-4章习题集
  10. TTS Service Extended (进程:com.google.tts)意外停止 恢复被阉割的TTS文字转语音功能
  11. SERC2013 J You Win!
  12. 启动mongodb时发现错误libcrypto.so.10
  13. 软件测试最牛的8本书籍—你有读过吗?
  14. onlyoffice+vue实现在线预览在线编辑
  15. php微信昵称保存,附件十四 存储微信昵称的处理方法
  16. GSL(C数学运算库)安装和使用教程
  17. 协同过滤(collaborative filtering)
  18. 机器学习习题(16)
  19. Zhong__k8s基础尝试和配置flannel
  20. [ 数据通信面试篇 ] 数通面试题大集合(详解),看完直怼面试官(一)

热门文章

  1. kafka reassign 限速_为什么德国的高速就能不限速?
  2. 2013年上海市居住证新政策解读
  3. PostgreSQL 怎么通过命令来恢复删除的数据
  4. win7 按修改时间范围文件搜索
  5. mysql从5.7平滑升级到8.0.27
  6. 移动APP的测试流程及方法
  7. 使用树莓派与微信公众平台对接(python)
  8. 【机器学习】对数线性模型之Logistic回归、SoftMax回归和最大熵模型
  9. python惰性求值例子_惰性求值和yield-Python
  10. 中国煤层气开发市场发展态势及投资规划深度研究报告2022-2028年