PKU 1559 Equation Elation

http://poj.org/problem?id=1559
与えられた数式の計算過程を出力するような問題。

入力のパースがキモだと感じましたが、こういう問題は好きなタイプです。
数学ゲーとかもスパスパ解けるようになりたいですが、才能みたいなものがないとこういうので解いた数を稼ぐしかないんですよね。

int stoi(const string&in){
  stringstream ss(in);
  int ret;
  ss>>ret;
  return ret;
}

string itos(int in){
  stringstream ss;
  ss<<in;
  return ss.str();
}

string in;
int pos;

string getnum(){
  string ret;
  if(in[pos]=='+')++pos;
  if(in[pos]=='-')ret+=in[pos++];
  while(pos<SZ(in) && (isalpha(in[pos]) || isdigit(in[pos])))ret+=in[pos++];
  return ret;
}

main(){
  string temp;
  bool fi=false;
  while(getline(cin,temp)){
    if(fi)cout<<endl;
    fi=true;
    
    in.clear();
    rep(i,SZ(temp)){
      if(temp[i]==' ')continue;
      in+=temp[i];
    }
    vector<string> q;
    pos=0;
    q.pb(getnum());
    while(pos<SZ(in)){
      string op;
      op+=in[pos++];
      q.pb(op);
      q.pb(getnum());
    }
    rep(i,SZ(q)){
      if(i)cout<<' ';
      cout<<q[i];
    }
    cout<<endl;

    while(SZ(q)>3){
      vector<string> nq;
      int opos=1;
      for(int i=1;i<SZ(q)-1;i+=2){
        if(q[i]=="*" || q[i]=="/"){
          opos=i;
          break;
        }
      }

      nq.pb(q[0]);
      for(int i=1;i<SZ(q);i+=2){
        if(i==opos){
          int a=stoi(nq.back());nq.pop_back();
          char op=q[i][0];
          int b=stoi(q[i+1]);
          switch(op){
          case '+':a+=b;break;
          case '-':a-=b;break;
          case '/':a/=b;break;
          case '*':a*=b;break;
          }
          nq.pb(itos(a));
        }else nq.pb(q[i]),nq.pb(q[i+1]);
      }
      rep(i,SZ(nq)){
        if(i)cout<<' ';
        cout<<nq[i];
      }
      cout<<endl;
      q=nq;
    }
  }
}