全排列之后判断是否符合要求,模拟火车进栈的情况
这里其他的是没有什么问题的,然后是否有序这里的话,是根据模拟做的,

//这里可以写两个数组
入栈数组 stackIn 出栈数组 stackOut 变量 in out
首先1、如何数组的头和出栈数组的头是能对的上 in++ out++
2、和栈顶元素是对的上 in++ stk.pop()
3、都对不上但是能入栈 in++ 入栈
4、前三种情况都不行 也就是说即和出栈数组对不上 又和栈顶元素对不上 又没有元素可以入栈
也就是说没法匹配 那么就返回假
这个循环结束都没有返回假,就是匹配完了,返回真

#include<iostream>
#include<stack>
using namespace std;
bool vis[15];
int stackOut[15],step=0,n,stackIn[15];
//判断顺序 
bool judge();

void dfs(int step){
    for(int i=1;i<=n;i++){
        if(vis[i]==0){
            vis[i]=1;
            stackOut[step]=i;
            if(step==n){
                if(judge()){
                    for(int j=1;j<=n;j++){
                        cout<<stackOut[j]<<" ";
                    }
                    cout<<endl;
                } 
            }else{
                dfs(step+1);
            }
            vis[i]=0;
        }
    }
}
//根据入栈顺序判断出栈顺序是否合理 
bool judge(){
    int in=1,out=1; 
    stack<int> stk; 
    while(out<=n){
        //和入栈顺序对的上 
        if(in<=n&&stackOut[out]==stackIn[in]){
            out++;
            in++;
        //和栈顶元素对的上 
        }else if(!stk.empty()&&stk.top()==stackOut[out]){
            stk.pop();
            out++;

        //即跟入栈顺序不一样,也跟栈顶元素不一样 
        }else if(in<=n){
            //入栈 
            stk.push(stackIn[in]);
            in++;    

        }else{
            return false;
        }
    }
    return true;
} 

int main(){
    while(cin>>n){    
        for(int i=1;i<=n;i++){
            cin>>stackIn[i];
        }
        dfs(1);
    }
    return 0;
}