洛谷 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. 转Meta的http-equiv属性详解
  2. 深入理解 Java 注解
  3. hdu 4289 Control
  4. wifi漫游测试过程
  5. python如何绘制曲线图_python怎么画曲线图
  6. 自由口通信模式下计算机读写PLC存储区的程序
  7. 滑动窗口限流 java_Spring Boot 的接口限流算法优缺点深度分析
  8. 收集系统性能数据并通过gnuplot绘图
  9. 爬虫笔记1-Requests库的基本方法
  10. jxls能把html转成excel吗,如何用XLSTransformer生成excel文件?jxls的使用方法
  11. 生物医学传感器实验装置
  12. JavaScript 设计模式 —— 单例模式
  13. 计算机进入启动死循环,教你win10重启死循环怎么解决
  14. css3动画animation属性大全
  15. 卸载 mysql 2008_强力卸载SQL Server 2008图文详解
  16. “职”等你来!阿里云2020年专场招聘来了
  17. MySQL中支持的字符集和排序规则
  18. android自定义相机带方框,Android摄像头开发:拍照后添加相框,融合相框和图片为一副 图片...
  19. 宝藏下载神器,python一键下载B站视频
  20. mt2503 Phonebook 开机初始化过程

热门文章

  1. 完整电商项目--(八)商品订单模块(1):订单结算与 mysql事务
  2. 反编译工具之jadx
  3. html图片轮播放大,jquery+CSS3实现轮播图、js实现轮播图片自适应等比显示、图片旋转、图片拖拽、鼠标滚动放大缩小...
  4. 执着于音,一起开启Fidelio音乐之旅
  5. Ubuntu下添加开机启动项的2种方法
  6. windows快速添加开机启动项/禁用开机启动项
  7. 智能优化算法:侏儒猫鼬优化算法-附代码
  8. [T00ls]DEDECMS 0DAY
  9. java文本框双击可编辑_JS实现双击内容变为可编辑状态
  10. nb移动udp_电信NB物联网平台不仁不义有人来管管吗?