循环队列--搬书问题

循环队列

作业
实训05-循环队列的实现
题目:有7位同学(学号依次分别是1028,1085,1025,1062,1079,1040,1118)
被要求把100本教材从办公室搬到教室,假设偶数为女同学,奇数为男同学,
女同学每次搬4本教材,男同学每次搬7本教材,他们排着队依次行动,
请问:每位同学分别搬运几次,每人分别搬运了多少本教材?

要求:用循环队列解答上述题目。
1)初始化顺序存取结构的队列
2)实现初始化队列,判队空、入队、出队操作
3)显示7位同学入队过程,完成搬运过程和出队过程。
队列--先进先出

extranceIndex:入口索引

exportIndex:出口索引

入队列操作

循环队列--搬书问题

......

......

循环队列--搬书问题

出队列操作就是exportIndex++

当exportIndex==extranceIndex时表示只剩下最后一个元素了

exportIndex==-1时表示队列为空

代码:

#include <stdio.h>
//循环队列
#define MaxSize 7
int getGender(int value) {
	return value % 2;
}

/// <summary>
/// 循环队列
/// </summary>
typedef struct CircleQueue {
	int data[MaxSize];
	int exportIndex;//出口index							弹出元素时出口index++  
	int entranceIndex;//入口index						添加元素时入口index++	出口index不变 先进先出
}circleQueue;

circleQueue* initCircleQueue(){
	circleQueue * queue = malloc(sizeof(circleQueue));
	if (queue) {
		queue->entranceIndex = -1;
		queue->exportIndex = -1;
	}
	return queue;
}

void EnQueue(circleQueue* queue, int value) {
	if (IsFull(queue) == 1) {
		printf("添加失败! 队列中元素已经存满了\n");
		return;
	}
	
	queue->data[++queue->entranceIndex %MaxSize] = value;
	if (queue->exportIndex == -1) {
		queue->exportIndex = queue->entranceIndex;
	}
	printf("%d 开始排队了..\n\n", value);
}

int DeQueue(circleQueue* queue) {
	if (IsEmpty(queue) == 1) {
		printf("这是个空队列\n");
		return;
	}
	
	int value=	queue->data[queue->exportIndex % MaxSize];
	if (queue->exportIndex == queue->entranceIndex) {//当入口index等于出口index时表示只剩最后一个元素了  此时出队列就表示队列空了
		queue->exportIndex = -2;										//  然后出口index=-2 因为下面还有个++操作  就是出口index=-1  满足判空条件																		
	}
	queue->exportIndex++;
	printf("%d 出队列了...\n",value);
	return value;
}

int IsFull(circleQueue* queue) {
	if ((queue->entranceIndex +1)%MaxSize==queue->exportIndex) {
		return 1;//满了
	}
	return 0; 
}

int IsEmpty(circleQueue* queue) {
	/*if (queue->entranceIndex == queue->exportIndex) {
		return 1;
	}*/
	if (queue->exportIndex == -1) {
		return 1;
	}
	return 0;
}

/// <summary>
/// 搬书操作
/// </summary>
void MoveBook(circleQueue* queue,int books) {
	int tmpClassmate = -1;
	while (books>0)
	{
		tmpClassmate = DeQueue(queue);
		if (getGender(tmpClassmate) == 0) {
			if (books >= 7) {
				books -= 7;//男同学一次搬7本
				printf("%d同学搬了:【%d】本书", tmpClassmate, 7);
			}
			else {
				printf("%d同学搬了:【%d】本书", tmpClassmate, books);
				books -= books;
			}
		}
		else {
			if (books >= 4) {
				books -= 4;//女同学一次搬4本
				printf("%d同学搬了:【%d】本书", tmpClassmate, 4);
			}
			else {
				printf("%d同学搬了:【%d】本书", tmpClassmate, books);
				books -= books;
			}
		}
		EnQueue(queue, tmpClassmate);//该同学继续排队
	}
	printf("\n书搬完了.....");
}

int main() {
	circleQueue* queue = initCircleQueue();
	DeQueue(queue);
	EnQueue(queue, 1028);
	EnQueue(queue, 1085);
	EnQueue(queue, 1025);
	EnQueue(queue, 1062);
	EnQueue(queue, 1079);
	EnQueue(queue, 1040);
	EnQueue(queue, 1118);
	EnQueue(queue, 1118);
	MoveBook(queue, 100);
}

此时并没有完,,还有一个计算每人搬运了多少本教材,搬运了多少次

so...定义一个struct Classmate表示每个同学的信息

typedef struct Classmate {
	int code;
	int hasMovedCount;//已经搬运的总数
	int maxMovedCount;//一次能搬运的最大数量;
}classmate;

然后写一个初始化同学的方法 用于设置一些值,比如男、女同学一次最多能搬运的数量

/// <summary>
/// 初始化同学
/// </summary>
/// <param name="code">传入code
/// <returns></returns>
classmate* initClassmate(int code) {
	classmate* element = malloc(sizeof(classmate));
	if (element) {
		element->code = code;
		if (getGender(code) == 0) {
			element->maxMovedCount = 7;//男同学一次最多能搬7本书
		}
		else {
			element->maxMovedCount = 4;//女同学一次最多能搬4本书
		}
		element->hasMovedCount = 0;//这行可以不添加 因为int默认值是0
	}
	return element;
}

完整代码...

#include <stdio.h>
#include <math.h>
//循环队列
#define MaxSize 7
int getGender(int value) {
	return value % 2;
}

typedef struct Classmate {
	int code;
	int hasMovedCount;//已经搬运的总数
	int maxMovedCount;//一次能搬运的最大数量;
}classmate;


/// <summary>
/// 初始化同学
/// </summary>
/// <param name="code">传入code
/// <returns></returns>
classmate* initClassmate(int code) {
	classmate* element = malloc(sizeof(classmate));
	if (element) {
		element->code = code;
		if (getGender(code) == 0) {
			element->maxMovedCount = 7;//男同学一次最多能搬7本书
		}
		else {
			element->maxMovedCount = 4;//女同学一次最多能搬4本书
		}
		element->hasMovedCount = 0;//这行可以不添加 因为int默认值是0
	}
	return element;
}

/// <summary>
/// 循环队列
/// </summary>
typedef struct CircleQueue {
	classmate* data[MaxSize];
	int exportIndex;//出口index							弹出元素时出口index++  
	int entranceIndex;//入口index						添加元素时入口index++	出口index不变 先进先出
}circleQueue;


circleQueue* initCircleQueue(){
	circleQueue * queue = malloc(sizeof(circleQueue));
	if (queue) {
		queue->entranceIndex = -1;
		queue->exportIndex = -1;
	}
	return queue;
}

void EnQueue(circleQueue* queue, classmate* value) {
	if (IsFull(queue) == 1) {
		printf("添加失败! 队列中元素已经存满了\n");
		return;
	}
	
	queue->data[++queue->entranceIndex %MaxSize] = value;
	if (queue->exportIndex == -1) {
		queue->exportIndex = queue->entranceIndex;
	}
	printf("%d 开始排队了..\n\n", value->code);
}

classmate* DeQueue(circleQueue* queue) {
	if (IsEmpty(queue) == 1) {
		printf("这是个空队列\n");
		return;
	}
	
	classmate* value=	queue->data[queue->exportIndex % MaxSize];
	if (queue->exportIndex == queue->entranceIndex) {//当入口index等于出口index时表示只剩最后一个元素了  此时出队列就表示队列空了
		queue->exportIndex = -2;										//  然后出口index=-2 因为下面还有个++操作  就是出口index=-1  满足判空条件																		
	}
	queue->exportIndex++;
	printf("%d 出队列了...\n",value->code);
	return value;
}

int IsFull(circleQueue* queue) {
	if ((queue->entranceIndex +1)%MaxSize==queue->exportIndex) {
		return 1;//满了
	}
	return 0; 
}

int IsEmpty(circleQueue* queue) {
	/*if (queue->entranceIndex == queue->exportIndex) {
		return 1;
	}*/
	if (queue->exportIndex == -1) {
		return 1;
	}
	return 0;
}

/// <summary>
/// 搬书操作
/// </summary>
void MoveBook(circleQueue* queue,int books) {
	classmate* tmpClassmate;
	while (books>0)
	{
		tmpClassmate = DeQueue(queue);
		if (books >= tmpClassmate->maxMovedCount) {
			books -= tmpClassmate->maxMovedCount;
			tmpClassmate->hasMovedCount += tmpClassmate->maxMovedCount;
			printf("%d同学搬了:【%d】本书", tmpClassmate->code, tmpClassmate->maxMovedCount);
		}
		else {
			printf("%d同学搬了:【%d】本书", tmpClassmate->code, books);
			tmpClassmate->hasMovedCount += books;
			books -= books;
		}
		EnQueue(queue, tmpClassmate);//该同学继续排队
	}
	printf("\n书搬完了.....\n");
}

void DisplayDetails(circleQueue* queue) {
	for (int i = 0; i < MaxSize; i++)
	{
		printf("%d同学搬运了%d次,一共搬运了%d本书...\n",
			queue->data[i]->code,
			(int)ceil((double)queue->data[i]->hasMovedCount / queue->data[i]->maxMovedCount),
			queue->data[i]->hasMovedCount
		);
	}
}

int main() {
	circleQueue* queue = initCircleQueue();

	DeQueue(queue);
	EnQueue(queue, initClassmate(1028));
	EnQueue(queue, initClassmate(1085));
	EnQueue(queue, initClassmate(1025));
	EnQueue(queue, initClassmate(1062));
	EnQueue(queue, initClassmate(1079));
	EnQueue(queue, initClassmate(1040));
	EnQueue(queue, initClassmate(1118));
	EnQueue(queue, initClassmate(1118));
	MoveBook(queue, 100);

	DisplayDetails(queue);
}

</math.h></stdio.h></stdio.h>

上一篇:muduo 库解析之三:Date


下一篇:SSM整合