#include<iostream>
#include<stack>
#include<cmath>
#include<string>
#define INF 1000000000
#define ERROR return INF;
using namespace std;
string str[1001000];
long long N[1001000];
long long x,cnt=0,m;
struct My_stack{
stack<long long>sta;
long long SIZE()
{
return sta.size();
}
long long CLEAR()
{
while(!sta.empty())
sta.pop();
}
long long GET(long long &x,long long &y)
{
if(sta.size()<2)return INF;
else
{
long long t1=sta.top();x=t1,sta.pop();
long long t2=sta.top();y=t2,sta.pop();
return 725;
}
}
long long TOP()
{
if(sta.empty())ERROR
else return sta.top();
}
long long NUM(long long x)
{
if(abs(x)>INF)ERROR
else sta.push(x);
}
long long POP()
{
if(!sta.empty())sta.pop();
else ERROR
}
long long DUP()
{
long long t=sta.top();
sta.push(t);
}
long long INV()
{
if(TOP()==INF)ERROR
else if(abs(-TOP())>INF)ERROR
else sta.push(-TOP());
}
long long SWP()
{
long long x,y;
if(GET(x,y)==INF)ERROR
else sta.push(y),sta.push(x);
}
long long ADD()
{
long long x,y;
if(GET(x,y)==INF)ERROR
else if(abs(x+y)>INF)ERROR
else sta.push(x+y);
}
long long SUB()
{
long long x,y;
if(GET(x,y)==INF)ERROR
else if(abs(y-x)>INF)ERROR
else sta.push(y-x);
}
long long MUL()
{
long long x,y;
if(GET(x,y)==INF)ERROR
else if(abs(x*y)>INF)ERROR
else sta.push(x*y);
}
long long DIV()
{
long long x,y;
if(GET(x,y)==INF)ERROR
else if(x==0)ERROR
else if(abs(y/x)>INF)ERROR
else sta.push(y/x);
}
long long MOD()
{
long long x,y;
if(GET(x,y)==INF)ERROR
else if(x==0)ERROR
else if(abs(y%x)>INF)ERROR
else sta.push(y%x);
}
}S;
long long work(long long x)
{
S.CLEAR();
S.NUM(x);
for(int p=1;p<=cnt;p++)
{
if(str[p]=="NUM")if(S.NUM(N[p])==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
else if(str[p]=="POP")if(S.POP()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
else if(str[p]=="INV")if(S.INV()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
else if(str[p]=="DUP")if(S.DUP()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
else if(str[p]=="SWP")if(S.SWP()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
else if(str[p]=="ADD")if(S.ADD()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
else if(str[p]=="SUB")if(S.SUB()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
else if(str[p]=="MUL")if(S.MUL()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
else if(str[p]=="DIV")if(S.DIV()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
else if(str[p]=="MOD")if(S.MOD()==INF){cout<<"ERROR"<<endl;ERROR break;}else ;
}
return 725;
}
int main()
{
string s;
while(cin>>s&&s!="END")
{
if(s=="NUM")cin>>x,N[++cnt]=x;
else N[++cnt]=-INF;
str[cnt]=s;
if(s=="END")break;
}
cin>>m;
for(int p=1;p<=m;p++)
{
cin>>x;
if(abs(x)>INF)
{
cout<<"ERROR"<<endl;
continue;
}
if(work(x)==INF)continue;
else if(S.TOP()==INF||S.SIZE()!=1)cout<<"ERROR"<<endl;
else cout<<S.TOP()<<endl;
}
}
代码略长,不过思路个人认为还是很清晰的(大雾
布吉岛哪里错了,题解区提到的坑点全写了,好像是 ERROR 多了?/fad/fad/fad
求助