#include<stdio.h>
#define MaxLen 100
struct snode
{
int data[MaxLen];
int top;
}s; //定义一个栈指针
int n;
void push(int q)
{
s.top++;
s.data[s.top]=q;
}
int pop()//出栈,并删除
{
int temp;
temp=s.data[s.top];
s.top--;
return temp;
}
int Emptys()//判断栈空
{
if(s.top==-1)
return 1;
else
return 0;
}
/*
每次调用求值阶段包含两重递归,只有全部返回,才表示本CXnum 处理完,可以对上一个元素求值,
process 就是找出当前元素进栈后所有可能的操作,即在当前元素进栈后各种情况下,
包括不出栈,立即出栈,出栈后继续出栈情况(出栈递归)下,继续处理下一个元素(入栈递归)
*/
void process(int CXnum,int path[],int count)
//当前处理位置CXnum的元素 path[]表示输出时候,各个输出序列的元素,count累加器
{
int m,i;
if(CXnum<n) //编号进栈递归
{
push(CXnum+1); //当前元素进栈后下一个元素继续进栈
process(CXnum+1,path,count); //处理下一个元素,返回表明下一个元素进栈的情况处理完了
pop(); //下一个元素处理完后,pop 掉,准备处理直接出栈
}
if(!Emptys())//若栈非空,则递归处理出栈
{
m=pop();
path[count]=m;
count++;
process(CXnum,path,count);//出栈后处理下一个元素继续进栈
push(m);
}
if(CXnum==n&&Emptys())//输出一种可能的方案
{
for(i=0;i<count;i++) //此时,count=n
printf("%2d",path[i]);
printf("\n");
}
}
void main()
{
int path[MaxLen];
printf("输入要调度车厢总数:\n");
scanf("%d",&n); //定义输入序列总个数
s.top=-1;
push(1);
printf("所有输出序列:\n");
process(1,path,0); //从1 开始,递归处理所有元素
}
车厢调度
最新推荐文章于 2020-10-22 20:52:23 发布