读书人

数据结构之车厢部署 思路很重要

发布时间: 2012-09-12 09:21:30 作者: rapoo

数据结构之车厢调度 思路很重要

问题描述]假设停在铁路调度站入口处的车厢序列的编号依次为1,2,3……N。设计一个程序,求出所有由此输出的长度为N的车厢序列。

要求3节车厢调度的方法,1代表进栈,0代表出栈。

有几点要注意的是,

第一、第一位一定要是1,因为不能一开始就出栈。

第二、最后一位不能为1,也就是不能最后进栈。

第三、0和1的数目要匹配,这里0和1都是3个,

第四、0不能比1多,这里用4来做比方,11000110,这种情况满足上面3个条件但是这样就是错误的

同学提供代码

#include<stdio.h>#include<stdlib.h>#define STACK_INI_SIZE 1000#define STACKINEMENT 10#define NULL 0typedef struct {int *base;int *top;int stacksize;int length;}stack;main(){void initlist(stack *s);void operation(stack *s);stack s;initlist(&s);operation(&s);}void initlist(stack *s){s->base=s->top=(int *)malloc(STACK_INI_SIZE*sizeof(int));if(!s->base){printf("开辟失败");exit(1);}s->length=0;s->stacksize=STACK_INI_SIZE;}void push(stack *s,int i){if(s->length==s->stacksize){s->base=(int *)realloc(s->base,(STACK_INI_SIZE+STACKINEMENT)*sizeof(int));s->length=STACK_INI_SIZE;s->stacksize+=STACKINEMENT;}*(s->top)=i;s->length++;s->top++;}void pop(stack *s){if(s->top==s->base){printf("栈空无法删除错误");exit(1);}s->top--;printf("%d ",*(s->top));*(s->top)=NULL;s->length--;}void operation(stack *s){int a[1000],i,j,k,m,n,l,z,y,flag1=1,flag2=1;char ch;printf("请输入车厢数\n");scanf("%d",&i);flag1=1;for(j=0;j<i*2;j++)/*对数组初始化为10101010,即首组输出的数据为1234*/{a[j++]=1;a[j]=0;}while(flag1)/*总循环,输出所有满足条件的车厢调度*/{l=1,k=0;for(j=0;j<i*2;j++)/*输出车厢调度*/{if(a[j]==1)push(s,l++);else if(a[j]==0)pop(s);}printf("\n");for(j=0;j<i;j++)/*判断是否已经满足结束条件,结束条件为11110000*/if(a[j]==1)k++;if(k==i)flag1=0;a[i*2-1]++;/*尾数自加1*/while(flag2&&flag1){z=1,m=0,n=0,y=1;for(j=i*2-1;j>=0&&z;j--)/*假如自加之后是2的话,前一位自加1,本位为0*/if(a[j]!=2)z=0;else{   a[j]=0;a[j-1]++;}for(j=0;j<i*2&&y;j++)/*检验新的组合是否满足需求*/{if(a[j]==1)m++;else if(a[j]==0)n++;      elseprintf("错误\n");if(n>m)y=0;/*判断输出的时候栈是否为空,比如11000110*/}if(m==i&&n==i&&a[0]==1&&a[i*2-1]==0&&y==1)flag2=0;elsea[i*2-1]++;}flag2=1;}}




读书人网 >编程

热点推荐