问题描述]假设停在铁路调度站入口处的车厢序列的编号依次为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;
}
}