车厢调度算法

经典算法
#include<stdio.h>  
#include<stdlib.h>  

typedef int SElemType; 
typedef int Status; 

int end; 
long total=0;  


 

typedef struct stacklist 
 SElemType *base; 
 SElemType *top; 
 int stacksize; 
}SqStack; 


void Stack_init(SqStack *s) 
 s->base=(SElemType *)malloc(end*sizeof(int)); 
 if(!s->base) exit(0); 
 s->top=s->base; 
 s->stacksize=end; 

void Stack_Push(SqStack *s,SElemType e) 
*(s->top)++=e; 

SElemType Stack_Pop(SqStack *s) 
if(s->top==s->base) 
return 0; 
return *(--(s->top)); 

Status Stack_Empty(SqStack *s) 
if(s->top==s->base) 
return 1; 
return 0; 

Status Stack_Full(SqStack *s) 
if(s->top-s->base==end) 
return 1; 
return 0; 
void Stack_printreverse(SqStack s) 
 int *po,*p1; 
  p1 = po = s.base; 
printf("\t[%ld]: ",total); 
while(po!=s.top)  
printf("%d ",*po++); 
 printf("\n"); 

 


 
void search(SqStack *inputPoint,SqStack *tempPoint,SqStack *outputPoint) 
if(!Stack_Empty(inputPoint)) 
Stack_Push(tempPoint,Stack_Pop(inputPoint)); 
search(inputPoint,tempPoint,outputPoint); 
Stack_Push(inputPoint,Stack_Pop(tempPoint)); 
if(!Stack_Empty(tempPoint)) 
Stack_Push(outputPoint,Stack_Pop(tempPoint)); 
search(inputPoint,tempPoint,outputPoint); 
Stack_Push(tempPoint,Stack_Pop(outputPoint)); 
if(Stack_Full(outputPoint)) 
total++;
Stack_printreverse(*outputPoint); 
 


 
void main() 
SqStack input,temp,output; 
int i;
//long total=0;   
while(printf("\n\tPlease input the last Number of the Carriage: "),scanf("%d",&end)!= -1) 
{
total = 0;
 
Stack_init(&input); 
Stack_init(&temp); 
Stack_init(&output); 
 
for(i = end;i > 0;i--) 
Stack_Push(&input,i); 
search(&input,&temp,&output); 
printf("\n\t\tthe total:%ld\n",total); 
}
getchar(); 
return 0;
}



普通算法
#include<stdio.h>  
#include<stdlib.h>     
#define   MaxLen   100 
int n;//定义输入序列总个数    
struct   snode{     
    int   data[MaxLen];     
    int   top;     
}s;//定义一个栈指针          
void   Initstack()     
{     
    s.top=-1;     
}     
void   push(int q)//元素n进栈     
{     
    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;     
}     
 
void   process(int   pos,int   path[],int   curp)//当前处理位置pos的元素     
{     
    int   m,i;     
    if(pos
    {     
        push(pos+1);//当前元素进栈后下一个元素继续进栈     
        process(pos+1,path,curp);   //处理下一个元素,返回表明下一个元素进栈的情况处理完了  
        pop(); //下一个元素处理完后,pop 掉,准备处理直接出栈  
    }     
  
    if(!Emptys())//递归处理出栈     
    {     
        m=pop();     
        path[curp]=m;     
        curp++;     
        process(pos,path,curp);//出栈后处理下一个素继续进栈  
        push(m);     
    }     
    if(pos==n&&Emptys())//输出一种可能的方案     
    {     
        for(i=0;i
            printf("-",path[i]);     
        printf("\n");     
    }     
}     
int main()     
{     
    int   path[MaxLen];     
    printf("输入要调度车厢总数:");     
    scanf("%d",&n);     
    Initstack();     
    push(1);     
    printf("所有输出序列:\n");     
    process(1,path,0); //从1 开始,递归处理所有元素   
    return 0;
}     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值