7-2银行业务队列简单模拟(C语言 数据结构 PTA 顺序队列)

设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。

输入格式:

输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。

输出格式:

按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。

输入样例:

8 2 1 3 9 4 11 13 15

输出样例:

1 3 2 9 11 4 13 15

分析

先进先出肯定是要用到队列的,先建立顺序队列,把该有的基本操作都写了

typedef struct {
	int data[MAX];
	int rear, front;
}Queue;
//初始化
void init(Queue *q) {
	q->rear = q->front = 0;
}
//判空
int isEmpty(Queue *q) {
	return(q->rear == q->front);
}
//判满
int isFull(Queue *q) {
	return(q->rear == MAX);
}
//入队
void push(Queue *q, int x) {
	if(!isFull(q)) {
		q->data[q->rear] = x;
		q->rear++;
	}
}
//出队
int pop(Queue *q) {
	int x;
	if(!isEmpty(q)) {
		x = q->data[q->front];
		q->front++;
	}
	return x;
}

再在主函数里实现题目要求,分别建立两个队列,顾客编号为奇数的放入队列A,顾客编号为偶数的放入队列B,题目要求最后一个编号后边不能有多余空格,所以定义一个count用来统计输出的编号个数,当count小于总数n时,都输出空格

int main() {
	Queue A, B;
	init(&A);
	init(&B);
	int n;
	scanf("%d",&n);
	for(int i = 0; i < n; i++) {
		int num;
		scanf("%d",&num);
		if(num % 2)
			push(&A, num);
		else
			push(&B, num);
	}
	int count = 0;
	while (!isEmpty(&A) || !isEmpty(&B)) {
        for (int i = 0; i < 2; i++) {
            if (!isEmpty(&A)) {
                int a = pop(&A);
                printf("%d", a);
                count++;
                if (count < n) {
                    printf(" ");
                }
            }
        }
        if (!isEmpty(&B)) {
            int b = pop(&B);
            printf("%d", b);
            count++;
            if (count < n) {
                printf(" ");
            }
        }
    }
}

完整代码如下

#include<stdio.h>
#define MAX 1000

typedef struct {
	int data[MAX];
	int rear, front;
}Queue;
//初始化
void init(Queue *q) {
	q->rear = q->front = 0;
}
//判空
int isEmpty(Queue *q) {
	return(q->rear == q->front);
}
//判满
int isFull(Queue *q) {
	return(q->rear == MAX);
}
//入队
void push(Queue *q, int x) {
	if(!isFull(q)) {
		q->data[q->rear] = x;
		q->rear++;
	}
}
//出队
int pop(Queue *q) {
	int x;
	if(!isEmpty(q)) {
		x = q->data[q->front];
		q->front++;
	}
	return x;
}

int main() {
	Queue A, B;
	init(&A);
	init(&B);
	int n;
	scanf("%d",&n);
	for(int i = 0; i < n; i++) {
		int num;
		scanf("%d",&num);
		if(num % 2)
			push(&A, num);
		else
			push(&B, num);
	}
	int count = 0;
	while (!isEmpty(&A) || !isEmpty(&B)) {
        for (int i = 0; i < 2; i++) {
            if (!isEmpty(&A)) {
                int a = pop(&A);
                printf("%d", a);
                count++;
                if (count < n) {
                    printf(" ");
                }
            }
        }
        if (!isEmpty(&B)) {
            int b = pop(&B);
            printf("%d", b);
            count++;
            if (count < n) {
                printf(" ");
            }
        }
    }
}

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 这道题目要求我们模拟银行业务队列的情况,主要考察对队列的理解和应用。我们需要根据题目给出的操作,模拟银行的排队情况,最后输出结果。 具体来说,我们需要定义一个队列,用来存储正在排队的客户。每当有新客户到来时,我们就将其加入队列末尾;每当柜台空闲时,我们就从队列头部取出一个客户进行服务。同时,我们还需要记录每个客户的等待时间,以便最后输出平均等待时间。 在模拟过程中,我们需要注意一些细节问题,比如客户到来的时间可能是乱序的,柜台的空闲时间也可能是乱序的。因此,我们需要对客户和柜台的状态进行排序,以便按照时间顺序进行模拟。 最后,我们需要输出每个客户的等待时间,以及平均等待时间。这个平均等待时间可以通过累加每个客户的等待时间,再除以客户总数得到。 总之,这道题目需要我们熟练掌握队列的基本操作,以及对时间序列的处理。只要认真思考,认真模拟,相信大家都能够顺利完成。 ### 回答2: 这道题要求模拟银行业务队列,考察了我们对队列的掌握和应用。解题思路大概分为以下几步: 1. 定义银行窗口队列。题目中要求了三个窗口和一个队列,我们可以通过定义3个变量来表示三个窗口队列可以使用Python内置的deque数据结构进行表示。 2. 对于每个人的到来,我们需要判断哪个窗口空闲,如果所有窗口都被占用,那么将这个人加入到队列中。如果有空闲窗口,直接将排队的第一个人送到窗口办理业务。 3. 窗口办理业务的时间随机生成,可以使用Python的random模块进行实现。 4. 数据的输出分为两个部分,一个是业务的详细流程,另一个是简单的统计结果,包括等待时间和服务时间。 在实现过程中需要注意以下几点: 1. 定义时间变量,用于记录当前排队窗口的情况。 2. 统计数据时需要记录整个队伍的等待时间和服务时间。必须要注意每个人之间的差异性,不同的窗口的服务时间都不同。 3. 对于每个人的等待时间和服务时间统计,使用一个列表数据结构进行记录,方便最终结果的输出。 总之,通过这道题,我们可以更深入的理解队列数据结构在模拟系统中的应用,熟悉Python中列表、队列、随机数等常见的数据结构和函数的应用。同时,准确输出统计结果在实际中也十分重要,我们需要严谨认真地统计每个客户的等待时间和服务时间,确保统计结果的准确性。 ### 回答3: 本题考察的是队列的应用。题目给出了一个银行的模拟场景,即银行中有n个客户,每个客户需要一定的时间来完成自己的业务,在业务处理过程中,其他客户需要排队等待,等待的客户按照先后顺序进行处理。我们需要计算出每个客户的开始时间和结束时间,并统计客户的平均等待时间和平均处理时间。 首先,我们需要定义客户的数据结构。由于每个客户需要知道自己的编号、到达时间和处理时间,因此我们可以使用结构体来表示客户的信息。 struct Customer { int id; // 客户编号 int arrive; // 客户到达时间 int time; // 客户需要处理的时间 }; 接下来,我们需要使用队列来模拟客户的排队过程。因为先到的客户先处理,所以我们使用一个先进先出的队列来管理等待中的客户。同时,我们还需要用两个变量来记录当前时间和等待时间总和。 queue<Customer> q; // 等待队列 int curTime = 0; // 当前时间 int waitTime = 0; // 等待时间总和 当所有客户的业务处理完毕后,我们需要计算平均等待时间和平均处理时间。由于我们已经记录了每个客户的等待时间和处理时间,所以我们可以通过累加这些时间然后除以客户数量来计算平均值。 int avgWaitTime = waitTime / n; int avgHandleTime = (endTime - beginTime) / n; 最后,我们需要按照客户的编号输出每个客户的开始时间和结束时间。 for (int i = 0; i < n; i++) { Customer customer = customers[i]; printf("%02d:%02d %02d:%02d\n", customer.arrive / 60, customer.arrive % 60, (customer.handleTime + customer.arrive) / 60, (customer.handleTime + customer.arrive) % 60); } 以上就是本题的核心思路,具体实现可以参考下面的完整代码。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值