循环队列
作业
实训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>