1、top=N-1) printf(nStack Overflow!n); return (False); else s-top+; |*新节点指向栈顶并将其数据赋值*|stacks-top=x; return (True);/* Initialize Stack */ElemType Pop(STACK *s) ElemType x; int i;toptop+1; x=s-stacki;|*该走的车开出后其余的车依原来的次序进场*| return x; /* Pop */void IniLinkedQue(LinkedQueTp *s) QUEUE *p1;front=(QUEUE *)mal
2、loc(sizeof(QUEUE);|*申请新节点*|rear=s-front;|*队空*| p1=s- p1-next=Null; /* 头结点指针域初始化 */num=0; /* 头结点数据域初始化 */* IniLinkedQue */void EnLinkedQue(LinkedQueTp *s,int num1) /* 数据入队列(链接式循环队列) */ QUEUE *p,*p1; p=(QUEUE *)malloc(sizeof(QUEUE); /* 产生一个新节点 */ p-num=num1;rear; /* 加入队尾 */next=p;rear=p;num+; /* 修改保存在
3、头结点数据域中的车辆数 */* EnLinkedQue */int DeLinkedQue(LinkedQueTp *s) /* 数据节点出队列 */ QUEUE *p; int n;front=s-rear) return (Null);|*判断是否队空*| p=s-front-next;|*令p指向头指针的前一个*|next=p-|*删除节点p*| if(p-next=Null) s-|*判断是否为空*| n=p-num; free(p);|*释放节点p*|num-;|*s指向队头数量递减*| return (n); /* DeLinkedQue */void Arrive(STACK *
4、s1,LinkedQueTp *p,ElemType x) /* 车辆到达处理 */ int f,no1,no2; /* 可以删去 */ f=Push(s1,x); /* 新到车辆进入停车场栈 */ if(f=False) /* 如停车场满, 就进入便道队列等待 */ EnLinkedQue(p,x.num);no1=p- /* 可以删去 */printf(第%d号车停在便道的第%d号车位上n,x.num,no1); /* 改为:,x.num,p-num); */ else /* 新到车辆进入停车场 */no1=s1- /* 可以删去 */no2=x.num;第%d号车停在停车场的第%d号车位
5、上n,no2,no1);,x.num,s1-top+1); /* Arrive */void Delive(STACK *s1,STACK *s2,LinkedQueTp *p,ElemType x) /* 离开处理 */ int n,f=False; ElemType y,z; /* 增加z */ QUEUE *q; while(s1-top-1) & (f!=True) /* 在停车场中寻找要离开的车辆 */ y=Pop(s1); if(y.num!=x.num) /* 如果栈顶元素不是要离开的车辆,就将其放如车辆规闭所*/ n=Push(s2,y); else f=True;/*/ if
6、(y.num=x.num) /*在停车场中找到要离开的车辆*/第%d号车应收费%d元,y.num,(x.arrtime-y.arrtime)*M); while(s2-1) -1) /* 调整到*处,将y改为z */ y=Pop(s2); f=Push(s1,y); n=DeLinkedQue(p); if(n!=Null) /* 有车在队列中等待 */ y.num=n; y.arrtime=x.arrtime;第%d号车停在停车场第%d号车位上n,y.num,s1- else /*在停车场中没有找到要离开的车辆*/-1) /* 删除 */y=Pop(s2);f=Push(s1,y); q=p
7、- /* 指向队头 */ f=False; while(f=False & q-next !=Null) /*在便道上寻找要离开的车辆*/ if(q-next-num!=x.num) q=q-next=q- /*在便道上找到该车辆*/next=Null) p-rear=q; /* =p-front是错误的 */第%d号车离开便道n,x.num);/*该车离开便道,但不收费*/ f=True; if(f=False)输入数据错误,停车场和便道上均无第%d号车nvoid main() /* 停车场模拟管理程序 */ char ch1,ch2; STACK *s1,*s2; LinkedQueTp
8、*p; int flag,t1,t2; s1=(STACK *)malloc(sizeof(STACK); s2=(STACK *)malloc(sizeof(STACK); p=(LinkedQueTp *)malloc(sizeof(LinkedQueTp); IniStack(s1); /* 初始化停车场栈 */ IniStack(s2); /* 初始化车辆规避所栈 */ IniLinkedQue(p);/* 初始化便道队列 */ flag=True; for(;) clrscr();n输入数据:A/D,车牌号,到达时间/离开时间nE-退出。 scanf(%c,%d,%d,&ch1,&t
9、1,&t2); x.num=t1; x.arrtime=t2; /* 只记录小时值,没有考虑分钟 */ ch2=getchar(); /* 清空输入缓冲区 */ switch(ch1) case a: Arrive(s1,p,x);nPress any key to continue.n getch(); break;d Delive(s1,s2,p,x);eE flag=False; printf(n程序正常结束n break; default:n输入数据错误,重新输入n if(flag=False) break; /* 退出循环 */ /*迷宫问题*/#define M2 12#defin
10、e N2 11#define MAXLEN M2string.hint M=M2-2,N=N2-2;typedef struct elem int x,y,dir;typedef struct stktag ElemType stackMAXLEN;|*存放站的数据元素*|*棧顶指针用来存放棧顶元素在数组中的下标*|typedef struct moved int dx,dy;MOVE;void IniMaze(int mazeN2); /*初始化迷宫*/void IniMove(MOVE move); |*移动位置*| |*初始化棧s*|*进栈*|void path(int mazeN2,M
11、OVE move,STACK *s);|*初始化路径*|void draw(int mazeN2,STACK *s);|*初始化迷宫数组*|void main() /* 寻找迷宫通路程序*/ STACK *s; int mazeM2N2; MOVE move8; IniMaze(maze); /* 初始化迷宫数组 */ s=(STACK *)malloc(sizeof(STACK); IniStack(s);|*初始化棧s为空栈*| IniMove(move);|*移动位置*| path(maze,move,s);|迷宫路径*| draw(maze,s);/* main */void IniM
12、aze(int mazeN2) /*初始化迷宫*/ int i,j,num; for(i=0,j=0;i=M+1;i+) mazeij=1; for(i=0,j=N+1;i+) mazeij=1;|*沿数组横向移动*|j=N+1;j+) mazeij=1; for(i=M+1,j=0;|*沿数组纵向移动*| for(i=1;=M;i+) for(j=1;=N;j+) num=(800*(i+j)+1500) % 327;|*将0和1散乱分布*| if (num|*s进棧并将其赋值为x*|/* Push */ElemType Pop(STACK *s) |*出棧*| ElemType elem;
13、 elem.x=Null; elem.y=Null; elem.dir=Null; return (elem);|*判断是否为空栈*|*从棧顶出棧*| return (s-top+1);/* pop */void path(int mazeN2,MOVE move,STACK *s) |*移动路径*| int i,j,dir,x,y,f; i=1; j=1; dir=0; maze11=-1; /* 设11为入口处 */ do x=i+movedir.dx; /* 求下一步可行的到达点的坐标 */ y=j+movedir.dy; if(mazexy=0) elem.x=i; elem.y=j;
14、 elem.dir=dir; f=Push(s,elem); if(f=False) printf(栈长度太短n i=x; j=y; mazexy=-1; else if(dirtop=-1) & (dir=7) | (x=M)&(y=N)&(mazexy=-1);top=-1) printf(此迷宫无路n elem.x=x;elem.y=y;elem.dir=dir;|*进棧函数*|n迷宫的通路是: i=0; while(itop) (%d,%d),s-stacki.x,s-stacki.y); /* 显示迷宫通路 */ if(i!top) printf(-|*非空*| if(i+1)%4=
15、0) printf( i+; /* path */void draw(int mazeN2,STACK *s) |*初始化路径数组*| int i,j;i+) /* 将迷宫中全部的-1值恢复为0值 */j+) if(mazeij=-1) mazeij=0; while(s-1) /* 根据栈中元素的坐标,将通路的各个点的值改为8 */ mazeij=8; else if(mazeij=8) printf( %c,*|*再通路标记*| /* 显示已标记通路的迷宫 */* draw */ /* 迷宫2-最短路线 */#define MAXLEN M2*N2typedef struct elem /
16、* 定义栈元素的数据类型 */ int x,y; int dir;typedef struct stktag /* 定义顺序栈结构 */|*存放棧的数据元素*| STACK;typedef struct QueEle /* 定义队列元素的数据类型 */ int pre; QueElem;typedef struct QueTag QueElem queueMAXLEN; int front,rear;|*定义队头队尾*| QUEUE;typedef struct moved /* 定义方向位移数组元素的类型 */ MOVE;|8初始化移动方位*|*初始化s为空棧*|*x进棧*|*出栈函数*|int shortpath(int mazeN2,MOVE move,QUEUE *p);void IniQueue(QUEUE *s); /* 初始化队列 */void printpath(QUEUE *p,STACK *s); int mazeM2N2,f;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1