题目传送门~

   这道题的本意是给定一颗二叉树的先序和中序序列,如何得到这颗二叉树的后序遍历序列,这个问题已经很古老了,然而今天是第一次写,想通了遍历的原理,很容易写出递归版本的求后序序列的函数,至于先序和中序可以从给定的数据获得,即push代表就是先序,pop代表的是中序,不懂请call陈越姥姥。
   先给出递归版本求后序遍历的递归函数版本。
   void Build(int *pre,int *in,int n)
{
    if(n==0)
    {
        return ;
    }
    int i;
    int c=pre[0];
    for(i=0;i<n;i++)
    {
        if(c==in[i])
            break;
    }
    Build(pre+1,in,i);///pre+1代表左子树的头结点,i代表左子树的长度,in代表中序左子树的头结点
    Build(pre+i+1,in+i+1,n-i-1);///pre+i+1代表右子树的根,n-i-1代表右子树的长度,in+i+1代表中序右子树的头结点
    q.push(pre[0]);
}

下面再给出本题的ac代码

///此题还可以简化,自己可以试一试,不用堆栈的解法。
/// @author just_sort
/// 2015/9/24 10:43
/// water~

#include<cstdio>
#include<cstring>
#include<vector>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<algorithm>
#include<ctype.h>
#include<cstdlib>
#include<iostream>
using namespace std;
typedef long long LL;
#define lowbit(x) x&(-x)
#define INF 0x7fffffff
#define UNF -9999999
typedef long long LL;

/*****I am swimming*****/
queue<int>q;

int pre[35],in[35];
void Build(int *pre,int *in,int n);

int main()
{
    string ss;
    int n;
    stack<int>s;
    cin>>n;
    n*=2;
    int cnt1=0,cnt2=0;
    for(int i=0;i<n;i++)
    {
       cin>>ss;
       if(ss=="Push")
       {
           scanf("%d",&pre[cnt1]);
           s.push(pre[cnt1++]);
       }
       else
       {
           in[cnt2++]=s.top();
           s.pop();
       }
    }
    ///已知先序和中序,求后序
    Build(pre,in,n/2);
    printf("%d",q.front());
    q.pop();
    while(!q.empty())
    {
        printf(" %d",q.front());
        q.pop();
    }

    //system("pause");
    return 0;
}

void Build(int *pre,int *in,int n)
{
    if(n==0)
    {
        return ;
    }
    int i;
    int c=pre[0];
    for(i=0;i<n;i++)
    {
        if(c==in[i])
            break;
    }
    Build(pre+1,in,i);///pre+1代表左子树的头结点,i代表左子树的长度,in代表中序左子树的头结点
    Build(pre+i+1,in+i+1,n-i-1);///pre+i+1代表右子树的根,n-i-1代表右子树的长度,in+i+1代表中序右子树的头结点
    q.push(pre[0]);
}