2024王道408数据结构 P93 T4
思考过程
-
首先看懂题目的意思,现在能载10辆车过江,车辆分为客车和货车两类。
- 客车先上4辆。
- 上完后才允许货车上一辆。
- 如果等待的客车不足4辆则用货车补
- 如果没有货车了就全上客车
其实这就已经把所有可能发生的情况都考虑到了。
- 我们需要一个目标队列ans用来放已经放在船上的车,一个队列h用来放货车,一个队列k用来放客车。其次我们需要一个变量j来记录目标队列ans上已经放了几辆车,一个变量i来记录客车数。
代码思路
明确了题目的意思就开始敲代码,这题分成四种情况上面已经都列举出来了,现在我们要转换成代码。
- 第一种情况当
i < 4 && !QueueEmpty(k)
时,就是当已经放上去的客车小于4辆并且客车还有剩余,我们就往目标队列里放客车,也就是DeQueue(k, x);EnQueue(ans, x);
用x来存放出队元素。最后记得计数器i++;j++;
表示放上去了一辆客车,目标队列里多了一辆车。 - 第二种情况就是当
i == 4 && !QueueEmpty(h)
,也就是现在客车已经放上去四辆了并且现在还有剩余的货车,我们就往上放一辆货车就行了。DeQueue(h, x); EnQueue(ans,x);
,就是把货车队列里的一辆车拉出来放进目标队列里了,最后也记得j++;i=0;
这里j++表示目标队列又多了一辆车,把i重新赋值为0表示又能够继续放客车了。 - 第三种情况就是现在已经没有四辆客车了,并且还有剩余货车,并且现在目标队列里的车还不满10辆,也就是
i < 4 && !QueueEmpty(h) && j < 10)
,此时while循环用货车来补,DeQueue(h,x);EnQueue(ans,x)
这种情况就是客车不足用货车补的情况,最后记得j++;i++;
,j++表示目标队列的车又多一辆,i++则表示把货车当客车补了一辆。 - 最后就是第四种情况,货车不够,让所有客车上船,这里我们在代码上直接
i=0
就可以了,因为把i重新赋值为0,此时程序就会重新往上寻找第一种情况,也就是又开始入客车了,当然用else if当然也可以。
此时四种情况全部判断完,如果目标车辆上的车还是不足10辆,j<10
那我们就退出循环。
完整代码如下
//
// Created by 黎圣 on 2023/8/2.
//
#include "iostream"
#define MAX 10
struct Queue
{
int f, r, tag;
int data[MAX];
};
//判断栈空
bool QueueEmpty(Queue q)
{
if (q.f == q.r && q.tag == 0)
return true;
return false;
}
//判断栈满
bool QueueOverflow(Queue &q)
{
if (q.f == q.r && q.tag == 1)
return true;
return false;
}
//入栈
bool EnQueue(Queue &q, int x)
{
if (QueueOverflow(q) == true)
{
printf("队满,入队失败\n");
return false;
}
q.data[q.r] = x;
q.r = (q.r + 1) % MAX;
q.tag = 1;
return true;
}
//出栈
bool DeQueue(Queue &q, int &x)
{
if (QueueEmpty(q) == true)
{
printf("队空,出队失败\n");
return false;
}
x = q.data[q.f];
q.f = (q.f + 1) % MAX;
q.tag = 0;
return true;
}
//这个可以不用写出来,我们为了方便看结果所以把队列中的元素打印出来
void display(Queue q)
{
while (!QueueEmpty(q))
{
printf("%d ", q.data[q.f]);
q.f = (q.f + 1) % MAX;
q.tag = 0;
}
printf("\n");
}
//题目主代码
void car()
{
//目标队列ans用来存放已经放在船上的车
//队列h用来放货车
//队列k用来放客车
Queue ans, k, h;
ans.f = 0, ans.r = 0, ans.tag = 0;
k.f = 0, k.r = 0, k.tag = 0;
h.f = 0, h.r = 0, h.tag = 0;
//这个也不用写出来,也是为了方便看结果所以赋个值
for (int i = 0; i < MAX; i++)
{
EnQueue(k, 1);
EnQueue(h, 2);
}
//变量j来记录目标队列ans上已经放了几辆车
//变量i来记录客车数
//x存放出队元素
int i = 0;
int j = 0;
int x = 0;
while (j < 10)
{
if (!QueueEmpty(k) && i < 4)//我先入4个客车
{
DeQueue(k, x);
EnQueue(ans, x);
j++;
i++;
}
else if (i == 4 && !QueueEmpty(h))//入一辆货车
{
DeQueue(h, x);
EnQueue(ans, x);
j++;
i = 0;
}
else//
{
//已经没有四辆客车了,并且还有剩余货车,并且现在目标队列里的车还不满10辆,用货车补
while (i < 4 && !QueueEmpty(h) && j < 10)
{
DeQueue(h, x);
EnQueue(ans, x);
j++;
i++;
}
//货车不够,让所有客车上船
i = 0;//此时程序就会重新往上进入第一个if,也就是又开始入客车了
}
if (QueueEmpty(h) && QueueEmpty(k))
break;
}
//这个也不用写出来
printf("客车队列");
display(k);
printf("货车队列");
display(h);
printf("目标队列");
display(ans);
}
int main()
{
car();
return 0;
}
这题不算难,但是要把所有可能出现的情况给考虑全,最后感谢b站up主@吸血小金鱼,感谢美女姐姐