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

问题描述]假设停在铁路调度站入口处的车厢序列的编号依次为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 0
typedef 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++;      
						else
							printf("错误\n");
						if(n>m)
							y=0;/*判断输出的时候栈是否为空,比如11000110*/
						
					}
					if(m==i&&n==i&&a[0]==1&&a[i*2-1]==0&&y==1)
						flag2=0;
					else
						a[i*2-1]++;
					
			}
			flag2=1;
	}
}



 


 

  • 14
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值