5AC 5WA
代码求调
#include<bits/stdc++.h>
using namespace std;
long long started=0,v[27];
long long proi(char c){
if(c=='+'||c=='-')return 1;
else if(c=='*'||c=='/')return 2;
else if(c=='('||c==')')return 0;
}
string tosuf(string s){
string r="";
stack<char>st;
for(long long i=0;i<s.size();i++){
if(isdigit(s[i])||isalpha(s[i]))r+=s[i];
else if(s[i]=='(')r+=' ',st.push(s[i]);
else if(s[i]==')') {
r+=' ';
while(st.top()!='(')r+=st.top(),st.pop();
st.pop();
}else{
r+=' ';
while(!st.empty()&&proi(st.top())>=proi(s[i]))r+=st.top(),st.pop();
st.push(s[i]);
}
}
r+=' ';
while(!st.empty())r+=st.top(),st.pop();
return r;
}
long long _calc(string s){
string k=tosuf(s);
stack<long long>ans;
bool dig=0;long long d=0;
for(long long i=0;i<k.size();i++){
if(isdigit(k[i])){
// cout<<k[i]<<" ";
d=d*10+k[i]-'0';
if(!dig)dig=1;
// cout<<d<<" "<<dig<<endl;
}else if(isalpha(k[i])){
ans.push(v[k[i]-'a']);
}else{
if(dig==1)ans.push(d);
// cout<<"push:"<<d<<endl;
d=0,dig=0;
if(k[i]=='+'||k[i]=='-'||k[i]=='*'||k[i]=='/'){
long long ai=ans.top();ans.pop();
long long bi=ans.top();ans.pop();
// cout<<ai<<" "<<bi<<endl;
if(k[i]=='+')ans.push(ai+bi);
if(k[i]=='-')ans.push(bi-ai);
if(k[i]=='*')ans.push(ai*bi);
if(k[i]=='/')ans.push(bi/ai);
}
}
}
return ans.top();
}
vector<string>lp;
int main(){
// freopen("x.txt","r",stdin);
string cmd;
while(cin>>cmd){
// if(cmd=="666")break;
lp.push_back(cmd);
}
long long now=0;
stack<long long>lpstart;
stack<long long>times;
while(now!=lp.size()-1){
// cout<<"now:"<<now<<" "<<lp[now]<<endl;
if(lp[now][1]=='='){
v[lp[now][0]-'a']=_calc(lp[now].substr(2));
now++;
}else if(lp[now]=="write"){
now++;
cout<<_calc(lp[now])<<endl;
now++;
}else if(lp[now]=="loop"){
lpstart.push(now);
times.push(1);
now+=2;
}else if(lp[now]=="end"){
long long lasttop=_calc(lp[lpstart.top()+1]);
// cout<<"lasttop:"<<lasttop<<endl;
// cout<<"timestop:"<<times.top()<<endl;
if(times.top()!=lasttop){
times.top()++;
now=lpstart.top()+2;
}else{
times.pop();
lpstart.pop();
now++;
}
}else if(lp[now]=="continue"){
times.top()++;
long long lasttop=_calc(lp[lpstart.top()+1]);
// cout<<"lasttop:"<<lasttop<<endl;
// cout<<"timestop:"<<times.top()<<endl;
if(times.top()==lasttop+1){
times.pop();
lpstart.pop();
long long mlp=0;
while(mlp!=-1){
if(lp[now]=="loop")mlp++;
else if(lp[now]=="end")mlp--;
now++;
}
}else{
now=lpstart.top()+2;
}
}else if(lp[now]=="break"){
long long mlp=0;
while(mlp!=-1){
if(lp[now]=="loop")mlp++;
else if(lp[now]=="end")mlp--;
now++;
}
}else now++;
}
}
求hack/帮助
有用的回答会关注的