题目描述

小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<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100000
using namespace std;
string s[];
int tot,n;
int num[MAXN],stack[MAXN];
void gets(int x){
tot++;
cin>>s[x];
if(s[x]=="END") return ;
if(s[x]=="NUM") scanf("%d",&num[x]);
gets(x+);
}
int main(){
gets();
scanf("%d",&n);
for(int i=;i<=n;i++){
int opt,top=,flag=;
scanf("%d",&opt);
stack[++top]=opt;
for(int j=;j<tot;j++){
if(s[j]=="NUM"){
if(num[j]>){ cout<<"ERROR"<<endl; flag=; break; }
stack[++top]=num[j];
}
else if(s[j]=="POP"){
if(top==){ cout<<"ERROR"<<endl; flag=; break; }
top--;
}
else if(s[j]=="INV"){
if(-stack[top]>){ cout<<"ERROR"<<endl; flag=;break; }
stack[top]=-stack[top];
}
else if(s[j]=="DUP"){
if(top==){ cout<<"ERROR"<<endl; flag=; break; }
stack[++top]=stack[top-];
}
else if(s[j]=="SWP"){
if(top<){ cout<<"ERROR"<<endl; flag=; break; }
swap(stack[top],stack[top-]);
}
else if(s[j]=="ADD"){
if(top<||stack[top]+stack[top-]>||stack[top]+stack[top-]<-){ cout<<"ERROR"<<endl; flag=; break; }
stack[top-]=stack[top]+stack[top-];top--;
}
else if(s[j]=="SUB"){
if(top<||stack[top-]-stack[top]>||stack[top-]-stack[top]<-){ cout<<"ERROR"<<endl; flag=; break; }
stack[top-]=stack[top-]-stack[top];top--;
}
else if(s[j]=="MUL"){
if(top<||stack[top]*stack[top-]>||stack[top]*stack[top-]<-){ cout<<"ERROR"<<endl; flag=; break; }
stack[top-]=stack[top]*stack[top-];top--;
}
else if(s[j]=="DIV"){
if(top<||stack[top-]==){ cout<<"ERROR"<<endl; flag=; break; }
stack[top-]=stack[top]/stack[top-];top--;
}
else if(s[j]=="MOD"){
if(top<||stack[top-]==){ cout<<"ERROR"<<endl; flag=; break; }
stack[top-]=stack[top]%stack[top-];top--;
}
}
if(flag) continue;
if(top!=){ cout<<"ERROR"<<endl; continue; }
else cout<<stack[top]<<endl;
}
}

50分代码

最新文章

  1. 查看mysql语句运行时间
  2. 宠物收养所(bzoj1208)
  3. Ajax全解
  4. extjs 远程数据源
  5. 集成骨骼动画Spine的几点经验
  6. kernel nf_conntrack: table full, dropping packet[转载]
  7. select_related
  8. H3C低端交换机MAC绑定
  9. centos6的安装
  10. RecyclerView.Adapter
  11. 找最大重复次数的数和重复次数(C++ Pair)
  12. HTML5&amp;CSS3读书笔记
  13. 理解Object.defineProperty的作用
  14. 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局
  15. jmeter5.1在windows(含插件安装)及linux环境下安装
  16. H5样式(个人使用)
  17. MVC+EF CODE FIRST的使用
  18. git 应用
  19. 关于IEnumerator&lt;T&gt;泛型枚举器 和 IEnumerable&lt;T&gt;
  20. Python3基础 __setattr__ 在属性被赋值的时候,新增提示功能

热门文章

  1. Hadoop2.6.0配置參数查看小工具
  2. bzoj1831: [AHOI2008]逆序对(DP+双精bzoj1786)
  3. [BZOJ3670] [NOI2014] 动物园 解题报告 (KMP)
  4. POJ 3187 全排列+杨辉三角(组合数)
  5. Eclipse输入智能提示设置
  6. tomcat到底是干什么用的?用大白话讲一下
  7. 机器学习(一) K-means聚类
  8. 对OC中property的一点理解
  9. CSS命令
  10. 「POJ3237」Tree(树链剖分)