有点恶心的模拟(代码写整齐一点不就好了)
以下情况算错:
1.运行中有数的绝对值大于1000000000
2.除以和取模的时候第一个数为0
3.取栈顶元素时栈内元素不够
上代码
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<stack> #define G if(top==0) { flag=1; break; }//取模和除以的时候第一个数等于0 using namespace std; stack<long long>s; long long x,top,b,flag,m=0,p,n,y[23333]; string w[23333],a; bool E2() { if(s.size()<2) return false; return true; }//栈内元素是否少于一个 bool E1() { if(s.size()<1) return false; return true; }//栈内元素是否少于两个 void Do() { s.pop(); b=s.top(); s.pop(); } void Clear() { if(s.size()) s.pop(); } void f(long long x) { Clear(); s.push(x); flag=0;//flag=1相当于错误 for(int i=1;i<=m;i++)//进行每一个操作 { a=w[i]; if(s.size()) top=s.top(); //压行大法好 if(a=="END") break; if(a=="NUM") s.push(y[i]); if(a=="POP"&&E1()) s.pop(); if(a=="INV"&&E1()) { s.pop(); s.push(-top); } if(a=="DUP"&&E1()) s.push(top); if(a=="SWP"&&E2()) { Do(); s.push(top); s.push(b); } if(a=="ADD"&&E2()) { Do(); s.push(top+b); E2(); } if(a=="SUB"&&E2()) { Do(); s.push(b-top); E2(); } if(a=="MUL"&&E2()) { Do(); s.push(b*top); E2(); } if(a=="DIV"&&E2()) { Do(); G; s.push(b/top); E2(); } if(a=="MOD"&&E2()) { Do(); G; s.push(b%top); E2(); } if(s.size()&&abs(s.top())>1000000000) { flag=1; break; } } if(s.size()!=1||flag) printf("ERROR\n");//错误 else printf("%lld\n",s.top()); } int main() { while(cin>>w[++m])//读入 { if(w[m]=="END") break; if(w[m]=="NUM") { scanf("%lld",&y[m]); } } scanf("%lld",&n); for(int i=1;i<=n;i++) { scanf("%lld",&p); f(p); } return 0; }