全部合法顺序——对栈和队列的应用

来源:互联网 发布:linux中socket通信 编辑:程序博客网 时间:2024/06/06 01:35

                                                                     全部合法顺序

                                                                                               ——对栈和队列的应用

大家还记得判断出栈顺序是否合法那道题吗。。。

现在拓展一下,题目要求输入n,并且输出它出栈的所有合法排序。。。

#include<iostream>using namespace std;#include<stdio.h>#define MaxSize 100int n;int Stack[MaxSize];//顺序栈int Queue[MaxSize];//顺序对void fun2(int rear,int top,int i)//作用:处理第i个进入轨道{int j;if(rear==n)//n个元素已全部入队,并输出此时的队列{for(j=1;j<=n;j++)cout<<Queue[j]<<" ";cout<<endl;}else{if(top>-1)//若栈不空{rear++;//队尾指针后移Queue[rear]=Stack[top];//出栈一个元素并把它入队top--;//栈顶指针前移fun2(rear,top,i);//递归处理第一种情况top++;//恢复处理前的状态Stack[top]=Queue[rear];rear--;}if(i<=n)//若转轨栈右边还有元素未处理{top++;//编号为i的元素进栈Stack[top]=i;fun2(rear,top,i+1);//递归处理第二种情况}}}int main(){scanf("%d",&n);fun2(0,-1,1);return 0;}

详解:在右边的轨道上有n个车皮顺序排列,求他在左边轨道上所有可能得到的车皮编号顺序。。。

左边的轨道用顺序队列表示,转轨栈用顺序栈表示。假设在某一时刻,队尾指针为rear,栈顶指针为top,编号为i的车皮来到转轨栈的入口处,这种状态情况下,处理方法用递归。输出栈顶元素,那么,队列中就多了一个元素,栈中就少了一个元素,转轨栈入口处的车皮标号一样是i。还有一种情况。i进栈。那么,队列中元素不变,栈中元素多了一个,转轨栈入口处的车皮编号变成了i+1,此时也用递归即可。。。


0 0