第一次写有瑕疵多多包涵
一、问题内容

该模拟程序中包含多个队列,可以使用队列数组来模拟这些队列。假设杂货店共5条收银线,顾客可随机进入支付。顾客会进入最短的队伍,如果队伍一样长,那么选择最靠近的的一个队伍。每次交易完成所消耗的时间也是随机的。
完成一些额外工作,扩展杂货店排队程序,使得客户可以:
1.如果等待超过了某个时间,可以离开队伍。
2.在给定的时间间隔内,检查另一个队伍是否更短。如果另一个队伍更短,则切换队伍。
3.如果有朋友正在排队,则可以插队。

这是第二个思路,直接贴代码

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define MaxSize 100
typedef struct
{   int data[MaxSize];          //保存队中元素int front,rear;             //队头和队尾指针
} People;
void InitQueue(People &p)       //初始化循环队列p
{p.rear=p.front=0;
}int DisplayQueue(People p)     //返回队列中的元素个数
{   int b=0;for(;p.front!=p.rear;){p.front++;b++; } return b;
}
int EnQueue(People &p)  //进队
{   int a,i;if(DisplayQueue(p)==0)       //首次随机分配顾客 a=rand()%21+30;else a=rand()%11; if(DisplayQueue(p)+a>=60)   //控制队列保持在60人以下下 ,避免队伍人数过多 {a=0;};for(i=0;i<a;i++){p.data[p.rear+1]=1;p.rear++;}return 1;
}int DeQueue(People &p)     //出队
{int i,a;if(DisplayQueue(p)<=10)     //当人数过少时,出队元素最大值为总元素个数 a=rand()%(DisplayQueue(p)+1);elsea=rand()%11;for(i=0;i<a;i++){p.front++;}return a;
}
int shortline(int total[]) // 返回最短队
{int b=total[0],c,i;for(i=0;i<5;i++){if(b>=total[i]){b=total[i];c=i;}} return c;
}
int enterandleave(People &p,People &p2,People &p3,People &p4,People &p5,int a)
{    //你的出队和入队 switch(a){case 1:    {p.data[p.rear+1]=1;p.rear++;return DisplayQueue(p);break;}case 2:{p2.data[p2.rear+1]=1;p2.rear++;return DisplayQueue(p2);break;}case 3:{p3.data[p3.rear+1]=1;p3.rear++;return DisplayQueue(p3);break;}case 4:{p4.data[p4.rear+1]=1;p4.rear++;return DisplayQueue(p4);break;}case 5:{p5.data[p5.rear+1]=1;p5.rear++;return DisplayQueue(p5);break;}case 6:  {p.front++;break;}case 7:{p2.front++;break;}case 8:{p3.front++;break;}case 9:{p4.front++;break;}case 10:{p5.front++;break;}}
}
int friends(People p,int you)//随机生成朋友的位置,符合条件的位置输出
{int a=rand()%10,b=0;if(a==0){b=rand()%(DisplayQueue(p)-1)+2;if(b<you){return b;}elseb=0;};return b;
}
int change(People &p,People &p2,People &p3,People &p4,People &p5,int a,int &you,int &one,int &two,int &three,int &four,int &five)
{   //随机改变队伍人数和你的位置,以及朋友的位置 int n1,n2,n3,n4,n5;switch(a){case 1:{n1=DeQueue(p);n2=DeQueue(p2);n3=DeQueue(p3);n4=DeQueue(p4);n5=DeQueue(p5);you=you-n1;if(one>0){one=one-n1;};if(two>0){two=two-n2;};if(three>0){three=three-n3;};if(four>0){four=four-n4;};if(five>0){five=five-n5;};if(you<=1){return 0;}elseEnQueue(p);EnQueue(p2);EnQueue(p3);EnQueue(p4);EnQueue(p5);break;}case 2:{n1=DeQueue(p);n2=DeQueue(p2);n3=DeQueue(p3);n4=DeQueue(p4);n5=DeQueue(p5);you=you-n2;if(one>0){one=one-n1;};if(two>0){two=two-n2;};if(three>0){three=three-n3;};if(four>0){four=four-n4;};if(five>0){five=five-n5;};if(you<=1){return 0;}elseEnQueue(p);EnQueue(p2);EnQueue(p3);EnQueue(p4);EnQueue(p5);break;}  case 3:{n1=DeQueue(p);n2=DeQueue(p2);n3=DeQueue(p3);n4=DeQueue(p4);n5=DeQueue(p5);you=you-n3;if(one>0){one=one-n1;};if(two>0){two=two-n2;};if(three>0){three=three-n3;};if(four>0){four=four-n4;};if(five>0){five=five-n5;};if(you<=1){return 0;}elseEnQueue(p);EnQueue(p2);EnQueue(p3);EnQueue(p4);EnQueue(p5);break;}case 4:{n1=DeQueue(p);n2=DeQueue(p2);n3=DeQueue(p3);n4=DeQueue(p4);n5=DeQueue(p5);you=you-n4;if(one>0){one=one-n1;};if(two>0){two=two-n2;};if(three>0){three=three-n3;};if(four>0){four=four-n4;};if(five>0){five=five-n5;};if(you<=1){return 0;}elseEnQueue(p);EnQueue(p2);EnQueue(p3);EnQueue(p4);EnQueue(p5);break;}case 5:{n1=DeQueue(p);n2=DeQueue(p2);n3=DeQueue(p3);n4=DeQueue(p4);n5=DeQueue(p5);you=you-n5;if(one>0){one=one-n1;};if(two>0){two=two-n2;};if(three>0){three=three-n3;};if(four>0){four=four-n4;};if(five>0){five=five-n5;};if(you<=1){return 0;}EnQueue(p);EnQueue(p2);EnQueue(p3);EnQueue(p4);EnQueue(p5);break;}}
}
void customer(People p,People p2,People p3,People p4,People p5)//输出每个队伍顾客人数
{int total[]={DisplayQueue(p),DisplayQueue(p2),DisplayQueue(p3),DisplayQueue(p4),DisplayQueue(p5)};for(int num=1;num<6;num++) printf("队伍%d有%d位顾客在等待\n",num,total[num-1]);
}void find(People p,People p2,People p3,People p4,People p5,int &a,int &you)//进入最短的队伍
{int total[]={DisplayQueue(p),DisplayQueue(p2),DisplayQueue(p3),DisplayQueue(p4),DisplayQueue(p5)};if(shortline(total)+1!=a){if(total[shortline(total)]<you-1){a=shortline(total)+1;printf("检查发现%d队伍更短\n",a);you=enterandleave(p,p2,p3,p4,p5,a);enterandleave(p,p2,p3,p4,p5,a+5);printf("成功排入最短的%d队\n",a);printf("你现在所在的位置为%d队第%d个顾客\n",a,you);}                }elseprintf("检查发现没有比你所在的队伍的位置更短\n");}
int inserted(int &one,int &two,int &three,int &four,int &five,int b,int &you)//插队
{int friends[]={one,two,three,four,five};switch(b){case 1:{if(one!=0){you=one;one++;printf("插队成功,你成为第%d队第%d位顾客\n",b,you);return 1;}else{printf("该队没有你的朋友,请重新输入\n");return 0;}break;}case 2:{if(two!=0){you=two;two++;printf("插队成功,你成为第%d队第%d位顾客\n",b,you);return 1;}else{printf("该队没有你的朋友,请重新输入\n");return 0;}break;}case 3:{if(three!=0){you=three;three++;printf("插队成功,你成为第%d队第%d位顾客\n",b,you);return 1;}else{printf("该队没有你的朋友,请重新输入\n");return 0;}break;}case 4:{if(four!=0){you=four;four++;printf("插队成功,你成为第%d队第%d位顾客\n",b,you);return 1;}else{printf("该队没有你的朋友,请重新输入\n");return 0;}break;}case 5:{if(five!=0){you=five;five++;printf("插队成功,你成为第%d队第%d位顾客\n",b,you);return 1;}else{printf("该队没有你的朋友,请重新输入\n");return 0;}break;}}
}
int main()
{People p,p2,p3,p4,p5;int a=0,b,you,i,count=0,c[5],n,j,flag=0,one,two,three,four,five,f=0,numfriends=0;srand((unsigned)(time(NULL)));//防止随机数每次重复 // unsigned是将time_t型数据转换为unsigned型再传给srand函数 // srand(time(NULL))使用系统时间初始化随机数 //srand()是初始化随机数与rand()函数搭配使用,time()从系统获得时间 InitQueue(p);InitQueue(p2);InitQueue(p3);InitQueue(p4);InitQueue(p5);EnQueue(p);EnQueue(p2);EnQueue(p3);EnQueue(p4);EnQueue(p5);int total[]={DisplayQueue(p),DisplayQueue(p2),DisplayQueue(p3),DisplayQueue(p4),DisplayQueue(p5)};for(int num=1;num<6;num++) printf("队伍%d有%d位顾客在等待\n",num,total[num-1]);for(i=0;i<5;i++){if(total[i]==total[shortline(total)]){c[count]=i; count++;}}if(count!=1){a=c[rand()%count]+1;printf("由于有%d条队伍一样长,所以随机选取离你最近的队伍%d队\n",count,a);you=enterandleave(p,p2,p3,p4,p5,a);printf("你所在的位置为%d队第%d个顾客\n",a,you);}else {  a=shortline(total)+1;printf("成功排入最短的%d队\n",shortline(total)+1);you=enterandleave(p,p2,p3,p4,p5,shortline(total)+1);printf("你所在的位置为%d队第%d个顾客\n",a,you);}for(i=0;i<6;i++){getchar(); if(change(p,p2,p3,p4,p5,a,you,one,two,three,four,five)==0){ printf("在这五分钟内,你已成功接受杂货店的收银台服务!\n");return 0;}if(i==5){   if(you>3) {printf("等了%d分钟,你等不住离开了杂货店\n",5*(i+1)); return 0;   }elseprintf("等了%d分钟,你前面没多少人,你决定再等等\n",5*(i+1));if(change(p,p2,p3,p4,p5,a,you,one,two,three,four,five)==0){  printf("在这五分钟内,你已成功接受杂货店的收银台服务!\n");return 0;}elseprintf("等了%d分钟,你生气的离开了杂货店\n",5*(i+2));}printf("等了%d分钟\n",5*(i+1));if(f==0){printf("1.检查是否有队伍更短\n");printf("2.查看是否有朋友正在排队\n");printf("请输入你的选项: 1 or 2\n");int t=1;while(t){scanf("%d",&n);switch(n){case 1:{customer(p,p2,p3,p4,p5);printf("你所在的位置为%d队第%d个顾客\n",a,you);find(p,p2,p3,p4,p5,a,you);t=0;break;}   case 2:{one=friends(p,you);two=friends(p2,you);three=friends(p3,you);four=friends(p4,you);five=friends(p5,you);int myfriends[]={one,two,three,four,five};for(j=0;j<5;j++){if(myfriends[j]==0){printf("在第%d个队伍里没有你的好友\n",j+1);  }else{printf("在第%d个队伍里第%d个位置有你的好友\n",j+1,myfriends[j]);flag=1;numfriends++;}}printf("你所在的位置为%d队第%d个顾客\n",a,you);if(flag==1){  int o=1;while(o){printf("请选择要插入的队伍(如果不想插队任意键取消)\n");scanf("%d",&b);if(b>=1&&b<=5) {j=inserted(one,two,three,four,five,b,you);if(j==1){enterandleave(p,p2,p3,p4,p5,b);enterandleave(p,p2,p3,p4,p5,a+5);a=b;o=0;numfriends--;}}o=0; }   }; f=1;t=0;break;}default:{printf("请输入 1 or 2\n"); break;}}}getchar();}else{    if(numfriends==0){flag=0;};if(flag==1){printf("1.检查是否有队伍更短\n");printf("2.查看现在正在排队的朋友\n");printf("请输入你的选项: 1 or 2\n");int t=1;while(t){scanf("%d",&n);switch(n){   case 1:{customer(p,p2,p3,p4,p5);printf("你所在的位置为%d队第%d个顾客\n",a,you);find(p,p2,p3,p4,p5,a,you);t=0;break;}case 2:{int copy[]={one,two,three,four,five};int C,y=0;for(C=0;C<5;C++){if(copy[C]>2&&copy[C]<you){printf("在第%d个队伍里第%d个位置有你的好友\n",C+1,copy[C]);y=1;}}printf("你现在所在的位置为%d队第%d个顾客\n",a,you);int o=1;if(y==1){while(o){printf("请选择要插入的队伍(如果不想插队任意键取消)\n");scanf("%d",&b);if(b>=1&&b<=5) {  j=inserted(one,two,three,four,five,b,you);if(j==1){enterandleave(p,p2,p3,p4,p5,b);enterandleave(p,p2,p3,p4,p5,a+5);a=b;o=0;}} o=0;}  }else{printf("在你前面的朋友都已成功接受杂货店的收银台服务!\n");flag=0;printf("你正在检查是否有队伍更短\n");customer(p,p2,p3,p4,p5);printf("你所在的位置为%d队第%d个顾客\n",a,you);find(p,p2,p3,p4,p5,a,you);}t=0;break;} default:{printf("请输入 1 or 2\n"); break;}}}getchar();   }else{printf("你正在检查是否有队伍更短\n");customer(p,p2,p3,p4,p5);printf("你所在的位置为%d队第%d个顾客\n",a,you);find(p,p2,p3,p4,p5,a,you);}       }}
}

数据结构 杂货店排队问题(新思路)相关推荐

  1. 研究生二年级该怎么安排_教二年级学生编码是什么感觉

    研究生二年级该怎么安排 在大流行中进行教学–一半的老师,一半的技术支持 (Teaching in the Middle of a Pandemic - Half Teacher, Half Tech ...

  2. 银行排队问题--事件链表+多窗口队列(数据结构课本)

    银行排队问题 事件驱动模拟问题 问题分析: ​ 银行开放了4个窗口,现在客户要从四面八方到银行办理业务:根据常识,到银行就少不了排队.我们排队按最短队伍排列,中途不切换队伍. ​ 现在随机生成到银行办 ...

  3. 数据结构实训 杂货店排队

    第一次写有瑕疵多多包涵 一.问题内容 该模拟程序中包含多个队列,可以使用队列数组来模拟这些队列.假设杂货店共5条收银线,顾客可随机进入支付.顾客会进入最短的队伍,如果队伍一样长,那么选择最靠近的的一个 ...

  4. 写jsx_一种让小程序支持JSX语法的新思路

    React社区一直在探寻使用React语法开发小程序的方式,其中比较著名的项目有Taro,nanachi.而使用React语法开发小程序的难点主要就是在JSX语法上,JSX本质上是JS,相比于小程序静 ...

  5. 递归与递推 普通排队问题及带约束条件的排队问题 c代码

    先看下题目: 电影院买票排队,票价50,排队的人中携带50元的有20个人,携带100的有10个人,售票处开始时没有余额, 问最多有多少种排队方式使得售票处能够找的开(携带相同数额的人交换位置算一种排队 ...

  6. PTA 数据结构与算法题目集(中文)

    一:数据结构与算法题目(中文版) 7-2 一元多项式的乘法与加法运算 (20 分) 7-3 树的同构 (25 分) 7-4 是否同一棵二叉搜索树 (25 分) 7-6 列出连通集 (25 分)(详解) ...

  7. 7-48 银行排队问题之单窗口“夹塞”版 (30 分)(思路和详解+map做法)来呀Baby!

    一:题目 排队"夹塞"是引起大家强烈不满的行为,但是这种现象时常存在.在银行的单窗口排队问题中,假设银行只有1个窗口提供服务,所有顾客按到达时间排成一条长龙.当窗口空闲时,下一位顾 ...

  8. 数据结构和算法练习网站_视频和练习介绍了10种常见数据结构

    数据结构和算法练习网站 "Bad programmers worry about the code. Good programmers worry about data structures ...

  9. C++ 数据结构 线性链表

    #pragma once 减少头文件组合,降低编译出错的概率 作用等效于 #ifndef FUNC_H #define FUNC_H代码主体#endif 线性表的定义 排队问题 简单的线性表 (物理 ...

最新文章

  1. void * 指针和const 指针
  2. dart 替代java_Dart与Java的语法区别
  3. Spring构造函数注入和参数名称
  4. Leetcode 152.乘机最大子序列
  5. 信息采集-火车采集器
  6. 利用贝叶斯分类器进行文本挖掘---笔记
  7. 急救模式下安装rpm包
  8. post postman 传递数组对象_okhttp传递数组参数
  9. 零基础适合学python吗-零基础,经济学专业,适合自学Python吗?
  10. 水面反光如何拍摄_「摄影技巧全解」「水面篇」不一样的水面粼粼波光
  11. python运算符用来计算集合并集的_Python 运算符中用来计算集合并集的是 _______ 。 (2.0分)_学小易找答案...
  12. 传奇服务器M2道士毒文件,传奇版本M2里面【Envir】文件功能说明
  13. 解释下ArrayList集合为啥允许值为null
  14. pc station v15 博图_博图的pcstation是做什么的?和wincc有什么区别?怎么使用?-工业支持中心-西门子中国...
  15. R语言柯西概率分布(cauchy distribution)函数(dcauchy, pcauchy, qcauchy rcauchy)实战
  16. 南京艺术学院计算机作曲,南京艺术学院932主科(上机操作计算机作曲应用)考研复习经验...
  17. 【Datawhale组队学习】机器学习数学基础 - 一元函数微分学的几何应用【Task 04】
  18. 计算机绘图图层基本线性,计算机绘图基础-第10章 尺寸标注.ppt
  19. 02 matplotlib - 柱状图、直方图、散点图 、饼图
  20. Joint Pose and Expression Modeling for Facial Expression Recognition 论文翻译

热门文章

  1. Thymeleaf系列六 模板 template
  2. ionic实现搜索框过滤关键字高亮
  3. 找回Administrator的密码方法两招
  4. WINDOWS2003的管理员Administrators的密码忘记,怎样去掉密码.
  5. css 最后一行文字对齐,如何在CSS中居中对齐最后一行文本?
  6. C++ std::string::npos常量(值为-1)(表示“直到字符串的结尾”,作为返回值,它通常用于表示不匹配)
  7. 用inkscape绘制晚安LOGO
  8. c++语言转换为字符串函数,C++中整型转换为字符串类型
  9. mysql 转字符串类型
  10. 实用好玩的API文档