车厢调度

本文通过一个具体的C语言程序实例,展示了如何使用栈结构来模拟一系列的入栈和出栈操作,以此来生成所有可能的调度序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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 开始,递归处理所有元素     
}     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值