全部合法顺序
——对栈和队列的应用
大家还记得判断出栈顺序是否合法那道题吗。。。
现在拓展一下,题目要求输入n,并且输出它出栈的所有合法排序。。。
#include<iostream>
using namespace std;
#include<stdio.h>
#define MaxSize 100
int 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,此时也用递归即可。。。