当前位置: 首页 > news >正文

1.6.课设实验-数据结构-栈、队列-银行叫号系统2.0

一.题目:

二.参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 5 static int temp; //记录队列长度 
static int result; //记录编号//人 
typedef struct
{//编号int num;//姓名char name[10]; 
}Person;static Person p; //记录个人(新添加的人) //队列
typedef struct
{//队列中的人,最多5个 Person p[MaxSize]; //队头指针 int front;//队尾指针int rear; //队列长度int length; 
}SqQueue; //顺序表
typedef struct
{//顺序表中定义长度为2的队列数组:vip队列(0索引)和普通队列(1索引) SqQueue Q[2];
}SqList; //初始化队列
void InitQueue(SqQueue &Q)
{//队头指针指向0Q.front=0;//队尾指针指向0Q.rear=0; //队列长度初始值为0,确保队列长度初始化为0Q.length=0; //这个一定不要忘了,不然遍历时会出死循环 
} //初始化顺序表
void InitList(SqList &L)
{for(int i=0;i<2;i++){InitQueue(L.Q[i]);}
} /*------------------------------李新元------------------------------*/ 
//判断队列是否为空
bool QueueEmpty(SqQueue Q)
{if(Q.front==Q.rear){return true; //队列为空 }else{return false; //队列非空 }
} //判断队列是否已满
bool QueueCrowded(SqQueue Q)
{if( (Q.rear+1)%MaxSize==Q.front ){return true; //队列已满 }else{return false; //队列未满 }
} //队列添加元素(入队列):人入队列 
bool EnQueue(SqQueue &Q,Person p)
{//判断是否队满if(QueueCrowded(Q)) return false; //此时队满//添加元素:此时队未满Q.p[Q.rear]=p;//修改尾指针Q.rear=(Q.rear+1)%MaxSize;//利用取余运算将存储空间在逻辑上变成了"环状" //队列长度加一Q.length++; //成功return true; 
}//队列删除元素(出队列):人出队列->队头元素出队列 
Person DeQueue(SqQueue &Q,Person p)
{//判断是否队空if(QueueEmpty(Q)) return p;//删除元素,返回给p p=Q.p[Q.front];//队头指针后移Q.front=(Q.front+1)%MaxSize;//队列长度减一Q.length--; //结果(返回被删除的人)return p; 
}
/*------------------------------李新元------------------------------*/ /*------------------------------青格勒------------------------------*/ 
//遍历顺序表
void IndicateInfo(SqList L)
{printf("         编号     姓名 \n");//先遍历的是vip队列for(int i=0;i<L.Q[0].length;i++){printf(" vip顾客:%d       %s \n",L.Q[0].p[ (L.Q[0].front+i)%MaxSize ].num,L.Q[0].p[ (L.Q[0].front+i)%MaxSize ].name);//从头开始遍历,所以从front开始 /*printf(" vip顾客:%d       %s \n",L.Q[0].p[i].num,L.Q[0].p[i].name);在遍历队列时,最好用取余运算将存储空间在逻辑上变成了"环状",再进行遍历也是为了正确遍历队列中的元素,避免死循环。*/} //再遍历的是普通队列 for(int i=0;i<L.Q[1].length;i++){printf("普通顾客:%d       %s \n",L.Q[1].p[ (L.Q[1].front+i)%MaxSize].num,L.Q[1].p[ (L.Q[1].front+i)%MaxSize ].name);//printf("普通顾客:%d       %s \n",L.Q[1].p[i].num,L.Q[1].p[i].name);} 
} //打印顺序表的第一个元素(正在办理的元素),表示办理结束,出队列,返回出队列的元素 
Person IndicateOutQueue(SqList &L) //需要&,因为顺序表值变了  
{//先判断vip队列是否为空if(QueueEmpty(L.Q[0])){//vip队列为空,判断普通队列是否为空if(QueueEmpty(L.Q[1])){//普通队列为空printf("全部办理结束 \n");exit(0); } else{//普通队列不为空,此队列第一个元素办理结束printf("编号为%d,姓名为%s正在办理业务 \n",L.Q[1].p[ L.Q[1].front ].num,L.Q[1].p[ L.Q[1].front ].name);printf("办理结束 \n");//第一个元素出队列并返回出队列的元素 return DeQueue(L.Q[1],L.Q[1].p[ L.Q[1].front ]);  }}else{//vip队列不为空,此队列第一个元素办理结束printf("编号为%d,姓名为%s正在办理业务 \n",L.Q[0].p[ L.Q[0].front ].num, //不是L.Q[0].p[0].numL.Q[0].p[ L.Q[0].front ].name);printf("办理结束 \n");                                        //第一个元素出队列并返回出队列的元素return DeQueue(L.Q[0],L.Q[0].p[ L.Q[0].front ]);} 
} 
/*------------------------------青格勒------------------------------*/ /*------------------------------杨志------------------------------*/ 
//判断所在队列是否满员,然后决定是否添加元素,如果添加了,返回添加的元素 
Person IncreasePerson(SqList &L,int result) //要加&,因为顺序表值变了 
{if(result!=1&&result!=2){printf("前先说明是否为vip \n");goto loop;//直接跳到loop里的return语句,此时p就为NULL,是空值,这里不能直接return NULL }if(QueueCrowded( L.Q[result-1]) ){//队列已满.无法添加 printf("所在队列已满,请在线上操作");exit(0);}else{//所在队列未满printf("所在队列未满 \n");//创建新的元素 Person p;//领取编号temp=L.Q[result-1].length;p.num=++temp; //是++temp,因为是先把长度自增后才是下一个元素的编号的值,再赋值,b不是temp++,temp++是先赋值再自增 printf("编号为%d \n",p.num);//填写姓名printf("请输入姓名:");scanf("%s",p.name); //添加 EnQueue(L.Q[result-1],p); //返回添加的元素 loop:return p;}
}
/*------------------------------杨志------------------------------*/ /*------------------------------刘佳鑫------------------------------*/ 
//比较姓名和编号来判断是否轮到自己(result就1和2两个值)
bool strcmpInfo(SqList L,int result,Person p)
{//比姓名int flag=strcmp(L.Q[result-1].p[ L.Q[result-1].front ].name,p.name);//比姓名和编号 if(flag==0&&L.Q[result-1].p[ L.Q[result-1].front ].num==p.num){printf("轮到自己办理 \n");printf("办理结束 \n");return true;} else{printf("前面还有顾客,请耐心等待 \n");return false;}
} 
/*------------------------------刘佳鑫------------------------------*//*------------------------------王豪杰------------------------------*/
//判断是否到自己的函数(result就1和2两个值)
bool OwnInfo(SqList L,int result,Person p)
{if(result!=1&&result!=2){printf("前先说明是否为vip \n");return false;}//为了提高效率,先判断自己是否是vip,然后在对应的队列查找if(result==1){//属于vip队列,判断此时vip队列里的第一个元素是否和自己匹配bool flag=strcmpInfo(L,result,p);//判断if(flag) return true; else return false;} else if(result==2){//属于普通队列,需要先看vip队列是否办理完,vip办理完才能到普通队列if(QueueEmpty(L.Q[0])){//此时vip客户已经办完 bool flag=strcmpInfo(L,result,p);//判断 if(flag) return true;else return false; }else{ printf("请先等待vip客户办理完 \n");return false;} }
} 
/*------------------------------王豪杰------------------------------*/int main()
{//1.创建两个队列,再存入顺序表SqQueue vipQ; //vip队列SqQueue comQ; //普通队列//2.创建顺序表 SqList L;L.Q[0]=vipQ;L.Q[1]=comQ;//3.初始化顺序表InitList(L);//4.vip队列和普通队列各定义一个元素 Person p1={1,"张三"}; //vip队列Person p2={1,"李四"}; //普通队列Person p3={2,"赵六"}; //普通队列//5.往vip队列和普通队列各自存入元素EnQueue(L.Q[0],p1);EnQueue(L.Q[1],p2); EnQueue(L.Q[1],p3); //6.输出顾客信息printf("正在排队的客户如下(vip队列和普通队列各队列最多5人): \n");IndicateInfo(L); printf("------------------------------------------------------------- \n");//7.操作界面 printf("             欢迎来到银行办理业务中心              \n"); printf("      1.输入是否为vip           2.取号 \n"); printf("      3.查看当前正在办理的客户  4.查看是否轮到自己 \n");printf("      5.查看正在排队的客户      6.停止办理 \n");//8.开始操作while(true){int choose;printf("请输入接下来的操作:");scanf("%d",&choose);switch(choose){case 1:{//输入自己是否是vip	printf("是否是vip:1.是  2.不是(输入编号即可) \n"); scanf("%d",&result);printf("------------------------------------------------------------- \n");break;}case 2:{//判断所在队列是否满员,然后决定是否添加元素(取号) p=IncreasePerson(L,result); //p这个变量属于自己的信息,全局要用,最好设为全局变量 printf("------------------------------------------------------------- \n");break;}	case 3:{//查看当前正在办理的客户,然后办理完的客户出队列 Person ownP=IndicateOutQueue(L); //ownP这个变量只在这个case语句中判断一下即可,没必要设为全局变量//判断自己是否已经办理完//比姓名int flag=strcmp(ownP.name,p.name);//比姓名和编号 if(flag==0&&ownP.num==p.num){printf("您已经办理完 \n");exit(0);}else{printf("还没轮到您,请稍等 \n");}printf("------------------------------------------------------------- \n");break;}	case 4:{//判断是否到了自己 if( OwnInfo(L,result,p) ) exit(0); //此时到了自己,办理结束,退出 printf("------------------------------------------------------------- \n");break;}	case 5:{//查看正在排队的客户  IndicateInfo(L);printf("------------------------------------------------------------- \n");break;}case 6:{//删除自己的位置DeQueue(L.Q[result-1],p);//退出exit(0); }default:{printf("不存在该选项 \n");printf("------------------------------------------------------------- \n");break;}			}} return 0;
}

http://www.dtcms.com/a/568904.html

相关文章:

  • 在amazon linux 2023上面通过Fedora 36软件仓库源安装tesseract5
  • seo网站做推广公司公司网站哪里好
  • 动态资源加载:不用Selenium,如何高效抓取Ajax和SPA网站?
  • 7.【NXP 号令者RT1052】开发——实战-串口通信
  • CANoe学习(二)使用CANdb++制作dbc
  • Node.js Buffer:深入理解与高效使用
  • Prompt Gen Desktop 管理和迭代你的 Prompt!
  • Prompt Composition with LangChain’s PipelinePromptTemplate
  • 【HarmonyOS NEXT】常见的性能优化
  • [Ethernet in CANoe]2--如何在CANoe中去仿真CP版本的SOME/IP通信
  • 优先队列(堆)
  • 基于 TCP 线程池服务器封装 HTTP 服务器:从协议解析到适配落地
  • xargs
  • 据库事务是数据库管理系统 ACID 四大特性
  • 宜昌市住房和城乡建设局网站wordpress后台慢
  • SSM基于HTML5的流浪动物领养平台yww0b(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 网站栏目分类网站开发市场
  • word转Pdf,在window正常,放在linux服务器上就转出来中文是空白
  • 攻防世界-Misc-pdf
  • 开启RN之旅——前端基础
  • 【LeetCode】99. 恢复二叉搜索树
  • 【rhcsa第一次作业】
  • 哪个网站做图找图片上海网络推广公司排名
  • 订单支付后库存不扣减,如何用RabbitMQ来优化?
  • Qt对话框设计
  • 解决 contents have differences only in line separators
  • 无锡建站方案深圳百度总部
  • Docker中安装 redis、rabbitmq、MySQL、es、 mongodb设置用户名密码
  • SAP EXCEL模板下载导入
  • 动态贝叶斯网络物联网应用方式