车厢调度算法

经典算法
#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;
}      
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值