《数据结构、算法与应用 —— C++语言描述》学习笔记 — 队列 —— 应用(一)

这篇博客详细介绍了队列在解决列车车厢重排和电路布线问题中的应用。在列车车厢重排问题中,通过先进先出的规则重新排列车厢,确保缓冲轨道上的车厢按编号递减。而在电路布线问题中,利用队列寻找起点到终点的最短路径。文章涵盖了问题的求解策略、实现细节以及界面逻辑的修改,展示了队列在算法和实际问题中的重要作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《数据结构、算法与应用 —— C++语言描述》学习笔记 — 队列 —— 应用(一)

一、列车车厢重排

在学习栈时,我们考察过这个问题。这次,我们稍微修改下我们的需求。所有的缓冲轨道不再是后进先出,而是先进先出:
在这里插入图片描述

1、求解策略

首先我们需要重新明确题目要求和有解条件。仿照我们前面的表述:

在重排车厢的过程中,仅允许以下移动:
(1)车厢可以从入轨道的前端移动到一个缓冲轨道的顶部或出轨道的后端。
(2)车厢可以从一个缓冲轨道的尾部移动到出轨道的后端。

该问题有解的两个条件:
(1)在整个过程中,任何一条缓冲轨道上的车厢都需要保证从顶到底是递减的。
(2)从入轨道中移动车厢到缓冲轨道时,如果有多个满足条件的缓冲轨道时,优先选择顶部车厢编号最大的缓冲轨道,空轨道的优先级最低。
同样,这个条件是为了保证所有的缓冲轨道都能被充分利用。但是其容量的计算方式与栈不同。我们可以认为每条轨道的剩余容量为 m a x N u m − 队 列 首 元 素 maxNum - 队列首元素 maxNum 。那么向某满足条件的缓冲轨道中添加新的车厢后,其容量减少为 车 厢 号 − 队 列 首 元 素 车厢号 - 队列首元素 。因此队首元素越大,添加新车厢后缓冲队列总容量越大。

2、实现

这里我把与流程或修改无关的代码去掉了,详情可以参考栈的应用中的算法描述和实现。

#pragma once
#include "arrayQueue.h" // change
...
tuple<bool, string> railroad(int inputOrder[], int numOfCars, int numOfTracks)
{
   
	...
	for (int i = 1; i < numOfCars + 1; i++)
	{
   
		if (inputOrder[i] == needCar)
		{
   
		...			
			while (smallestCar == needCar)
			{
   
				...
				for (int i = 0; i < numOfTracks; ++i)
				{
   
					if (!tracks[i].empty() && tracks[i].front() < smallestCar) // change
					{
   
						smallestCar = tracks[i].front(); // change
						smallestTrack = i;
					}
				}
				...
			}
		}
		else
		{
   	
			int bestTop = 0; // change   
			...
			for (int j = 0; j < numOfTracks; ++j)
			{
   
				if (!tracks[j].empty())
				{
   
					if (tracks[j].back() < inputOrder[i] && tracks[j].back() > bestTop) // change
					{
   
						bestTop = tracks[j].back(); // change
						bestTrack = j;
					}
				}
				...
			
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值