数据结构_顾客等待时间(队列)

某银行有一个客户办理业务站,在一天内随机地有客户到达,
设每位客户的业务办理时间是某个范围内的值。
设只有一个窗口,一位业务人员,
要求程序模拟统计在一天时间内,所有客户的平均等待时间。

模拟数据按客户到达的先后顺序依次由键盘输入,
对应每位客户有 两个数据,即 到达时刻 和 需要办理业务(占用)的时间。
测试样例格式说明:
[键盘输入]
第一行:一天内的客户总人数n

第二行:第一个客户的 到达时刻 和 需要办理业务的时间
第三行:第二个客户的到达时刻和需要办理业务的时间
……
第n行:第n - 1个客户的到达时刻和需要办理业务的时间
第n + 1行:第n 个客户的到达时刻和需要办理业务的时间

[正确输出]
第一行:所有客户的平均等待时间(精确到小数点后2位)

测试样例:
[第一组自测数据]
[键盘输入]
3
1 3
2 1
3 5
[正确输出]
1.33
[第二组自测数据]
[键盘输入]
4
1 1
12 5
15 1
16 5
[正确输出]
1.00*/
/*

比如说:
1 3(等待0时)
2 1(等待
3 5(最后一个人的占用时间不需要出栈,因为它后面没人了,也不需要关系他什么时候结束)

#define MAXLEN 100
#define EMPTY_QUEUE_ERROR -9999999
typedef int ElemType;
typedef struct {
int elem[MAXLEN]; // 用来存队列数据元素的数组
int front; // 指示队首在数组中位置的标识量
int rear; // 指示队尾在数组中位置的标识量adj.后面的,背面的,后方的
}intQueue;
/*初始化(调整两个位置标识量)*/
void InitQueue(intQueue* pQueue) // 指针类型作为形参,某个队列实例的地址
{
/**********************************************************
将该队列实例的队首和队尾标识量置零
*********************************************************/
pQueue->front = 0;
pQueue->rear = 0;
}
/*对头元素出队列*/
int DeQueue(intQueue* pQueue)
{
if (!IsEmpty(pQueue))
{
/*移动对头元素前保存该值*/
ElemType temp = pQueue->elem[pQueue->front];
/*向前移动front有讲究:
如果是:pQueue->front++,那么front可能会溢出数组,
所以必须利用循环队列的周期性质(除以周期取余数),保证不溢出*/
pQueue->front = (pQueue->front + 1) % MAXLEN;
return temp;/*删除成功的出口*/
}
return EMPTY_QUEUE_ERROR;
}
/*入队列
将某数据元素x入队列,成功返回1,失败返回0。*/
int EnQueue(intQueue* pQueue, ElemType x)
{
// 1、若该队列已满,则入队列失败
if (IsFull(pQueue)) return 0;
// 2、若该队列没满,将x写入队尾,然后队尾位置后移
else
{
pQueue->elem[pQueue->rear] = x;// x入队列
pQueue->rear = (pQueue->rear + 1) % MAXLEN;// 队尾后移
}
return 1;
}
/*只能处理整点/占用整数小时的情况(可以修改数据结构及相关函数的参数处理类型来提升使用范围*/
float avg_wait_time()
{
int n = 0,i = 0;
int come_time = 0,
occupy_time = 0;
int pre_time = 0,/*前一个人到的时间*/
pre_off_time = 0,/*前一个人离开的时刻*/
aft_time = 0;/*后一个人到达的时间*/
int sum_wait_time = 0;
intQueue q_come,
q_occupy;
InitQueue(&q_come);
InitQueue(&q_occupy);
printf("输入一天内的客户总人数n:\n");
scanf("%d", &n);
printf("输入到达时刻 和 需要办理业务(占用)的时间:\n");
while (i<n)
{
scanf("%d%d", &come_time, &occupy_time);
EnQueue(&q_come, come_time);
EnQueue(&q_occupy, occupy_time);
i++;
}//写入数据完毕
i = 0;
/*开始处理:*/
/*pre_time()提前准备好*/
pre_time = DeQueue(&q_come);
//这里以经预先弹出一个元素,在下方的循环中就要少运行一次;(最后一个人的占用时间不需要出栈,因为它后面没人了,也不需要关系他什么时候结束)
pre_off_time = pre_time;
while (i<n-1)
{
pre_off_time = pre_off_time + DeQueue(&q_occupy);
aft_time = DeQueue(&q_come);
if (pre_off_time > aft_time)
{
sum_wait_time += (pre_off_time - aft_time);
}
else
{
/*不做累加,但下一个人来的晚,以至于要调整pre_off_time(此时已不是本意了)*/
pre_off_time = aft_time;
}
/*为下一次比较做预备*/
i++;
}
return sum_wait_time * 1.0 / n;
}
int main()
{
printf("%.2f\n", avg_wait_time());
}
posted @   xuchaoxin1375  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
历史上的今天:
2022-06-07 NetWork_登录状态保持与身份认证cookie&token&session应用场景/对比
点击右上角即可分享
微信分享提示