-------------------------------------------------------------------------------
一.实验目的:
1、 学习栈和队列结构的特点,掌握其各种操作的实现; 2、 学习栈和队列的应用。 二.实验内容:
1、 设计一程序,求解迷宫问题。(要求:用栈结构) 2、 设计一程序,实现银行的电子排队业务,要求如下:
顾客进入则获得一服务编号;
顾客办理完业务,程序提示下一办理业务的顾客服务编号; 打印正在等待服务的顾客数。 (要求:用循环队结构) 三.程序: 1、C源代码
(1) #include int maze[MaxN][MaxN]; int MAZEPATH(int m,int n) { int stack[MaxMN][3]; int move[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}}; int p,i,j,k,g,h,top=0; maze[1][1]=2; /* MAZE[1][1]置一个非0非1的整数*/ stack[0][0]=1; stack[0][1]=1; stack[0][2]=1; while(top>=0){ i=stack[top][0]; j=stack[top][1]; k=stack[top--][2]+1; /*k为方向数,初值为2(即方向东)*/ while(k<8){ g=i+move[k][0]; h=j+move[k][1]; if(g==m-1&&h==n-1&&maze[g][h]==0) /*若找到迷宫的出口处*/ } {printf(\"\\n找到了一条通路!\\n\"); for(p=0;p<=top;p++) } if(maze[g][h]==0){ /*找到通路上的一个位置(g,h)*/ maze[g][h]=2; /*在该处置一个非0非1的整数*/ } stack[++top][0]=i; stack[top][1]=j; stack[top][2]=k; i=g;j=h;k=0; /*获得一个新的位置*/ printf(\"%d,%d->\printf(\"%d,%d->\ printf(\"%d,%d\\n\输出一条通路的坐标*/ return 1; /*找到通路,返回1*/ k++; /*试下一个方向*/ } printf(\"\\n没有找到迷宫通路!\\n\"); return 0; /*没找到通路,返回0*/ } void main() { int i,j,w,l,z; printf(\"请输入迷宫的尺寸:\\n\"); printf(\"迷宫的宽度: \"); scanf(\"%d\ printf(\"迷宫的高度: \"); scanf(\"%d\ for(j=0;j for(i=1;i } printf(\"请输入%d乘%d个数字\\n\ for(i=1;i maze[1][1]=0; printf(\"迷宫初始化结果如下:\\n\"); for(i=0;i<=m+1;i++){ for(j=0;j<=n+1;j++) printf(\"%3d\ printf(\"\\n\"); } printf(\"是否执行寻找通路操作,是选1\\n\"); scanf(\"%d\ if(w==1) z=MAZEPATH(m+1,n+1); } (2) # include void main() { int s (int p,int q); int front=0,rear=0; /*初始化队列*/ int j,z;j=1;z=0; int QUEUE[N]; while(1) { printf (\"\\n是否要办理业务?\\n1 办理\\n2 办理完毕\\n\\n \"); scanf (\"%d\switch(z) { case 1 : { if( (rear+1)%N==front ) /*循环队列已满*/ { printf (\"\\n办理业务人数过多,请稍候\\n\");break; } /*跳出循环*/ QUEUE[rear%N]=1000+j; rear=(rear+1)%N; /*循环队列未满,插入元素*/ printf (\"\\n您的服务编号为: %d\\n\if(j<=N) j++; else j=1; printf ( \"\\n排在您前面的人数为: %d\\n\输出剩余客户数*/ } break; case 2 : { if( front==rear ) /*循环队列为空,未办理业务*/ {printf(\"\\n对不起,您没有办理业务\\n\"); break;} if( (front+1)%N==rear ) /*所有数据处理完毕*/ { printf(\"\\n感谢你对我们服务的支持,欢迎下次光临\\n\");front=(front+1)%N;break; } front=(front+1)%N; printf (\"\\n请编号为 %d 的顾客到前台办理业务\\n\ printf ( \"\\n排在您前面的人数为: %d\\n\} break; default : printf (\"\\n您输入错误\\n\");break; } } } int s (int p,int q) /*计算剩余元素个数*/ { int z=0; if (p>q) z=p-q-1; if (p 执行寻找通路操作(1) 输出:找到一条通路! 1,1->2,1->3,2->3,3 (2)是否办理业务?1办理 2办理完毕 1 您的服务编号为:1001 排在您前面的人数为:0 是否办理业务?1办理 2办理完毕 1 您的服务编号为:1002 排在您前面的人数为:1 是否办理业务?1办理 2办理完毕 1 您的服务编号为:1003 排在您前面的人数为:2 是否办理业务?1办理 2办理完毕 2 请编号为1002的顾客到前台办理业务 排在您前面的人数为:1 四.程序调试过程: (1) 迷宫问题的算法课本中有详细的讲解,理解后也没有太大问题。不过 在输入迷宫的时候,还是出现了一些问题,比如首先应在整个迷宫的外面套上一圈其值均为1的元素。但在编程过程中却忘记了,结果无 法运行,最后不得不求助于课本,看到上面白纸黑字写着才恍然大悟,看来,必须要把课本弄懂才好。 (2) 循环队列,经常把队列空以及溢出的条件搞错,结果总是不对。同样 是多看书才把问题解决。另外,总是忽略循环的跳出,于是经常陷入死循环,最后不得不一点点分析,看哪儿该跳出,什么条件。这样,对循环也有了更好的认识与利用。 因篇幅问题不能全部显示,请点此查看更多更全内容2、程序规范(输入数据、功能、输出数据) (1)输入:3*3 0 0 1 0 1 1 1 0 0