地铁出站顺序问题(栈的输出顺序)
2013-11-21 19:44
411 查看
有这样一个具体问题,假设地铁只能在一条轨道上行驶,一条轨道上有多个地铁,地铁夜晚停车时需要停放在一条轨道上,早上发车时就存在一个出来的顺序问题?那么怎么解决发车时他们的顺序是怎么样呢?
假设有3个地铁,编号分别是1,2,3.在地铁上的顺序是1,2,3。在停车时他们可以顺序进入停车,停车时也是1,2,3,但是早上发车时必然是3,2,1.显然这是一个典型的先进后出,如何罗列出他们的所有情况呢?
我的基本思想是这样的,如果有3个,那么他们的停车出车必然会进行2*3=6次,每一个车必然会进去,出来,如果我们把进去标记为1出来标记为0,那么用一个长度为6的整形数组便可以存储他们的情况,但是要注意这个数组第一个元素必然是1进车,而最后一个必然是0出车,并且必然不会是100110这种情况,因为一个车进去,不可能有两个车出来,解决了以上问题,我们得到了所有情况下数组的值,便可以使用堆栈数据结构模拟所有地铁的进车出车过程,以及最后的顺序。
下面给出代码:
#include<stdio.h>
#include<stdlib.h>
struct train{
int n;
int p;
};
struct stack{
train *base;
train *top;
int num;
};
struct hh{
int *base;
int *top;
int num;
};
int n;
void moni(hh *h);
void Inith(hh *s){
s->base=(int*)malloc(20*sizeof(int));
if(s->base==NULL)exit(0);
s->top=s->base;
s->num=20;
}
void pushh(hh *s,int e)
{
if((s->top-s->base)>=s->num)
{
s->base=(int*)realloc(s->base,(s->num+10)*sizeof(int));
if(s->base==NULL)exit(0);
s->num=s->num+10;
}
*s->top=e;
s->top++;
}
void poph(hh *s,int *e)
{
if(s->top==s->base)exit(0);
*e=*--s->top;
}
void Init(stack *s){
s->base=(train*)malloc(20*sizeof(train));
if(s->base==NULL)exit(0);
s->top=s->base;
s->num=20;
}
void push(stack *s,train e)
{
if(s->top-s->base>=s->num)
{
s->base=(train*)realloc(s->base,(s->num+10)*sizeof(train));
if(s->base==NULL)exit(0);
s->num=s->num+10;
}
*s->top=e;
s->top++;
}
void pop(stack *s,train *e)
{
if(s->top==s->base)exit(0);
*e=*--s->top;
}
void print(hh *h)
{
hh *t;
t=(hh*)malloc(sizeof(hh));
Inith(t);
while(h->base!=h->top)
{
int nn;
poph(h,&nn);
printf("%d",nn);
pushh(t,nn);
}
printf("\n");
while(t->base!=t->top)
{
int nn;
poph(t,&nn);
pushh(h,nn);
}
}
int biaozhun(hh *h)
{
hh *t;
t=(hh*)malloc(sizeof(hh));
Inith(t);
int bj=1,i;
int shu=0;
shu=h->top-h->base;
//当堆栈数没有数量装够时,使用堆栈数的个数判断
if(n>shu)
{
for(i=1;i<=shu;i++)
{
int nn;
poph(h,&nn);
if(nn==1){bj=0;}
pushh(t,nn);
}
for(i=1;i<=shu;i++)
{
int nn;
poph(t,&nn);
pushh(h,nn);
}
}
else
{
for(i=1;i<=n;i++)
{
int nn;
poph(h,&nn);
if(nn==1){bj=0;}
pushh(t,nn);
}
for(i=1;i<=n;i++)
{
int nn;
poph(t,&nn);
pushh(h,nn);
}
}
//返回1代表满足条件,0代表不满足
if(bj==1)
{
return 1;
}
else
{
return 0;
}
}
void pailei(int n){
int i;
hh *h;
h=(hh*)malloc(sizeof(hh));
Inith(h);
int wz=2;
int zon=0;
pushh(h,1);
//zon判断是否小于0,小于0不能出车
zon=1;
do
{
for(i=wz;i<=2*n-1;i++)
{
if(zon>0)
{
pushh(h,-1);
zon--;
}
else
{
pushh(h,1);
zon++;
}
}
pushh(h,-1);
moni(h);
printf("-------------------------------------------\n");
//显示标记
//print(h);
zon--;
//bj==1时说明出来了火车,js为计数器
int bj=0,js=0;
//这里有问题
if(biaozhun(h)==0)
{
while(1)
{
js++;
int n;
poph(h,&n);
if(n==1)
{
zon--;
bj=1;
}
if(n==-1)
{
zon++;
}
if(bj==1&&n==-1)
break;
}
//把最后一个能变成-1变成1;
pushh(h,1);
zon++;
//位置赋值wz;
wz=2*n-js+2;
}
}while(biaozhun(h)==0);
}
void moni(hh *h){
hh *temp=(hh*)malloc(sizeof(hh));
int i;
stack *s1,*s2,*s3;
s1=(stack*)malloc(sizeof(stack));
s2=(stack*)malloc(sizeof(stack));
s3=(stack*)malloc(sizeof(stack));
Init(s1);
Init(s2);
Init(s3);
for(i=n;i>0;i--)
{
train t1;
t1.n=i;
t1.p=0;
push(s1,t1);
}
//while(!quan(s3,n))
Inith(temp);
//提取数据
while(h->base!=h->top)
{
int nu;
poph(h,&nu);
pushh(temp,nu);
}
//压回数据
while(temp->base!=temp->top)
{
int nu;
poph(temp,&nu);
//当是1则进车,-1则出车
if(nu==1){
train t;
pop(s1,&t);
printf("第%d号车进入停车位置\n",t.n);
push(s2,t);
}
else
{
train t;
pop(s2,&t);
printf("第%d号出车并进入轨道\n",t.n);
push(s3,t);
}
//把进出车标记压回
pushh(h,nu);
}
//显示运行顺序
stack *st;
st=(stack*)malloc(sizeof(stack));
Init(st);
while(s3->base!=s3->top)
{
train trr;
pop(s3,&trr);
push(st,trr);
}
printf("最后轨道运行时顺序为:");
while(st->base!=st->top)
{
train trr;
pop(st,&trr);
printf("%d",trr.n);
}
printf("\n");
//free(st);
free(s1);
free(s3);
free(s2);
free(temp);
}
void main(){
printf("输入几辆车\n");
scanf("%d",&n);
pailei(n);
}
96b3
假设有3个地铁,编号分别是1,2,3.在地铁上的顺序是1,2,3。在停车时他们可以顺序进入停车,停车时也是1,2,3,但是早上发车时必然是3,2,1.显然这是一个典型的先进后出,如何罗列出他们的所有情况呢?
我的基本思想是这样的,如果有3个,那么他们的停车出车必然会进行2*3=6次,每一个车必然会进去,出来,如果我们把进去标记为1出来标记为0,那么用一个长度为6的整形数组便可以存储他们的情况,但是要注意这个数组第一个元素必然是1进车,而最后一个必然是0出车,并且必然不会是100110这种情况,因为一个车进去,不可能有两个车出来,解决了以上问题,我们得到了所有情况下数组的值,便可以使用堆栈数据结构模拟所有地铁的进车出车过程,以及最后的顺序。
下面给出代码:
#include<stdio.h>
#include<stdlib.h>
struct train{
int n;
int p;
};
struct stack{
train *base;
train *top;
int num;
};
struct hh{
int *base;
int *top;
int num;
};
int n;
void moni(hh *h);
void Inith(hh *s){
s->base=(int*)malloc(20*sizeof(int));
if(s->base==NULL)exit(0);
s->top=s->base;
s->num=20;
}
void pushh(hh *s,int e)
{
if((s->top-s->base)>=s->num)
{
s->base=(int*)realloc(s->base,(s->num+10)*sizeof(int));
if(s->base==NULL)exit(0);
s->num=s->num+10;
}
*s->top=e;
s->top++;
}
void poph(hh *s,int *e)
{
if(s->top==s->base)exit(0);
*e=*--s->top;
}
void Init(stack *s){
s->base=(train*)malloc(20*sizeof(train));
if(s->base==NULL)exit(0);
s->top=s->base;
s->num=20;
}
void push(stack *s,train e)
{
if(s->top-s->base>=s->num)
{
s->base=(train*)realloc(s->base,(s->num+10)*sizeof(train));
if(s->base==NULL)exit(0);
s->num=s->num+10;
}
*s->top=e;
s->top++;
}
void pop(stack *s,train *e)
{
if(s->top==s->base)exit(0);
*e=*--s->top;
}
void print(hh *h)
{
hh *t;
t=(hh*)malloc(sizeof(hh));
Inith(t);
while(h->base!=h->top)
{
int nn;
poph(h,&nn);
printf("%d",nn);
pushh(t,nn);
}
printf("\n");
while(t->base!=t->top)
{
int nn;
poph(t,&nn);
pushh(h,nn);
}
}
int biaozhun(hh *h)
{
hh *t;
t=(hh*)malloc(sizeof(hh));
Inith(t);
int bj=1,i;
int shu=0;
shu=h->top-h->base;
//当堆栈数没有数量装够时,使用堆栈数的个数判断
if(n>shu)
{
for(i=1;i<=shu;i++)
{
int nn;
poph(h,&nn);
if(nn==1){bj=0;}
pushh(t,nn);
}
for(i=1;i<=shu;i++)
{
int nn;
poph(t,&nn);
pushh(h,nn);
}
}
else
{
for(i=1;i<=n;i++)
{
int nn;
poph(h,&nn);
if(nn==1){bj=0;}
pushh(t,nn);
}
for(i=1;i<=n;i++)
{
int nn;
poph(t,&nn);
pushh(h,nn);
}
}
//返回1代表满足条件,0代表不满足
if(bj==1)
{
return 1;
}
else
{
return 0;
}
}
void pailei(int n){
int i;
hh *h;
h=(hh*)malloc(sizeof(hh));
Inith(h);
int wz=2;
int zon=0;
pushh(h,1);
//zon判断是否小于0,小于0不能出车
zon=1;
do
{
for(i=wz;i<=2*n-1;i++)
{
if(zon>0)
{
pushh(h,-1);
zon--;
}
else
{
pushh(h,1);
zon++;
}
}
pushh(h,-1);
moni(h);
printf("-------------------------------------------\n");
//显示标记
//print(h);
zon--;
//bj==1时说明出来了火车,js为计数器
int bj=0,js=0;
//这里有问题
if(biaozhun(h)==0)
{
while(1)
{
js++;
int n;
poph(h,&n);
if(n==1)
{
zon--;
bj=1;
}
if(n==-1)
{
zon++;
}
if(bj==1&&n==-1)
break;
}
//把最后一个能变成-1变成1;
pushh(h,1);
zon++;
//位置赋值wz;
wz=2*n-js+2;
}
}while(biaozhun(h)==0);
}
void moni(hh *h){
hh *temp=(hh*)malloc(sizeof(hh));
int i;
stack *s1,*s2,*s3;
s1=(stack*)malloc(sizeof(stack));
s2=(stack*)malloc(sizeof(stack));
s3=(stack*)malloc(sizeof(stack));
Init(s1);
Init(s2);
Init(s3);
for(i=n;i>0;i--)
{
train t1;
t1.n=i;
t1.p=0;
push(s1,t1);
}
//while(!quan(s3,n))
Inith(temp);
//提取数据
while(h->base!=h->top)
{
int nu;
poph(h,&nu);
pushh(temp,nu);
}
//压回数据
while(temp->base!=temp->top)
{
int nu;
poph(temp,&nu);
//当是1则进车,-1则出车
if(nu==1){
train t;
pop(s1,&t);
printf("第%d号车进入停车位置\n",t.n);
push(s2,t);
}
else
{
train t;
pop(s2,&t);
printf("第%d号出车并进入轨道\n",t.n);
push(s3,t);
}
//把进出车标记压回
pushh(h,nu);
}
//显示运行顺序
stack *st;
st=(stack*)malloc(sizeof(stack));
Init(st);
while(s3->base!=s3->top)
{
train trr;
pop(s3,&trr);
push(st,trr);
}
printf("最后轨道运行时顺序为:");
while(st->base!=st->top)
{
train trr;
pop(st,&trr);
printf("%d",trr.n);
}
printf("\n");
//free(st);
free(s1);
free(s3);
free(s2);
free(temp);
}
void main(){
printf("输入几辆车\n");
scanf("%d",&n);
pailei(n);
}
96b3
相关文章推荐
- 问题三十:将输入的任意三个整数a、b、c,按从小到大的顺序输出
- 【技术】Java入门:e.printStackTrace()和System.out输出顺序混乱的问题
- 一道简单有趣的java题:输出顺序的问题
- 按顺序输出字符串问题
- 输出表达式中的顺序点问题
- C++输出流cout的顺序问题
- <<与++的问题运算与输出顺序
- Maximum Product Subarray 以及cout的输出顺序问题的讨论
- for in 循环的输出顺序问题
- C++输出流cout的执行顺序问题
- 关于逆序及顺序输出n的每一位的问题
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- 论坛上看到的一个java输出顺序问题。
- 关于c++ cout输出顺序问题。
- JsonObject存入顺序和输出顺序不一样问题-豆果
- setTimeout顺序输出的问题
- 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序(约瑟夫环问题)
- ZOJ顺序输出问题
- 列车调度问题 出站可能顺序
- 三色球排序的问题,相同的球放到一起,让你按顺序输出红白蓝三种颜色的球,可以用012来表示,要求只能扫描一次数组