数据结构-火车车厢重排问题(队列实现)

这篇具有很好参考价值的文章主要介绍了数据结构-火车车厢重排问题(队列实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

 转轨站示意图如下:

火车车厢重拍问题,数据结构,C语言,数据结构,c语言

 重排过程如下:

火车车厢重拍问题,数据结构,C语言,数据结构,c语言

 伪代码

1. 分别对k个队列初始化;
2. 初始化下一个要输出的车厢编号nowOut = 1; 
3. 依次取入轨中的每一个车厢的编号;
3.1 如果入轨中的车厢编号等于nowOut,则
    3.1.1 输出该车厢;
    3.1.2  nowOut++;
3.2 否则,考察每一个缓冲轨队列
    for (j=1; j<=k; j++)
 3.2.1 取队列 j 的队头元素c;
 3.2.2 如果c=nowOut,则
    3.2.2.1 将队列 j 的队头元素出队并输出;
    3.2.2.2  nowOut++; 
3.3 如果入轨和缓冲轨的队头元素没有编号为nowOut的车厢,则
    3.3.1 求小于入轨中第一个车厢编号的最大队尾元素所在队列编号j;
3.3.2 如果 j 存在,则把入轨中的第一个车厢移至缓冲轨 j;

晦涩的伪代码简直难啃,我们直接先分析一波这个实现过程 

        就算火车车厢的顺序打乱了之后,其编号也是连续的,可以利用这个点,所以我们定义三个队列:H1、H2、H3,将打乱的序列入队进H3,同时定义一个nowOut=1,让其自增,遍历序列H3,如当前遍历元素等于nowOut,那就将该元素出队,nowOut自增,否则就去H1和H2队列的对头去找有无等于nowOut的元素,若H1、H2、H3都没有nowOut,那么就将当前遍历的元素放进H1或H2条件是该元素必须大于H1或H2的队尾元素,如此循环完毕,最终可输出排列好的序列。

 代码实现

#include <stdio.h>
#define MAXSIZE 100
#define ERROR 0
#define OK 1
typedef int SElemType;
typedef int Status;

typedef struct Queue {
	SElemType data[MAXSIZE];
	int front;
	int rear;
} Queue;

//初始化队列 
void InitQueue(Queue *q) {
	q->data[0] = 0;
	q->front = 0;
	q->rear = 0;
}

//入队
Status EnQueue(Queue *q, SElemType num) {
	if(q->rear >= MAXSIZE - 1) {
		return ERROR;
	}
	q->data[q->rear] = num;
	q->rear++;
	return OK;
}

//出队
Status DeQueue(Queue *q, SElemType* num) {
	if(q->front >= q->rear) {
		return ERROR;
	}
	*num = q->data[q->front];
	q->front++;
	return OK;
}

//获取头元素 
Status GetHead(Queue *q, SElemType* num) {
	if(q->front >= q->rear) {
		return ERROR;
	}
	*num = q->data[q->front];
	return OK;
}

//获取尾元素 
Status GetRear(Queue *q, SElemType* num) {
	if(q->front >= q->rear) {
		return ERROR;
	}
	*num = q->data[q->rear-1];
	return OK;
}

int main() {
	Queue H1;
	InitQueue(&H1);
	Queue H2;
	InitQueue(&H2);
	Queue H3;
	InitQueue(&H3);
	Queue* QArray[] = {&H1, &H2, &H3};//指向结构体的指针数组,将H1,H2,H3放入数组 
	printf("请输入火车车厢,输入0停止输入\n");
	while(true) {//元素全部入队进H3 
		int num;
		scanf("%d", &num);
		if(num == 0) {
			break;
		}
		EnQueue(&H3, num);
	}
//	int num;
//	GetRear(&H3, &num);
//	printf("%d\n", num);

	int nowOut = 1;//火车车厢排序的关键 
	printf("\n出队序列为:");
	//遍历H3队列 
	while(H3.front < H3.rear || H1.front < H1.rear || H2.front < H2.rear) {
		int flag = 0;
		int num;
		GetHead(&H3, &num);
		//如果当前遍历元素等于nowOut就H3对头元素出队 
		if(num == nowOut) {
			DeQueue(&H3, &num);
			printf("%d", num);
			nowOut++;
			flag = 1;
		} else {
			//否则去寻找H1和H2对头元素是否等于nowOut,等于就出队 
			for(int i = 0; i < 2; i++) {
				GetHead(QArray[i], &num);
				if(num == nowOut){
					DeQueue(QArray[i], &num);
					printf("%d", num);
					nowOut++;
					flag = 1;
				}
			}
		}
		/*
		如果H1,H2,H3的对头都没有等于nowOut的元素,
		那么就将该元素入队至H1或H2,条件是小于队尾元素 
		*/
		if(flag == 0){
			int container;
			for(int i = 0; i < 2; i++){
				GetHead(&H3, &num);
				GetRear(QArray[i], &container);
				if(num > container || QArray[i]->rear == 0){
					DeQueue(&H3, &num);
					EnQueue(QArray[i], num);
					break;
				}
			}
		}
		
	}
	printf("\n\n2062011002-吴奇\n"); 
	return 0;
}

 测试用例

火车车厢重拍问题,数据结构,C语言,数据结构,c语言输入:369247185 0为结束符

输出:123456789

最后总结几个可以优化的点,感兴趣的小伙伴可以尝试实现以下文章来源地址https://www.toymoban.com/news/detail-860034.html

  1. 该算法中用到的是队列的顺序存储结构,想要改为环形只需将出队入队操作的索引稍做修改,就可实现环形队列。
  2. 输入方式比较不雅,可以进一步优化。
  3. 如想实现任意乱序的排列,我认为应再加一个队列,用2个队列作为缓冲轨某些情况下运行不是想象中的结果。

到了这里,关于数据结构-火车车厢重排问题(队列实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构课程设计之火车票订票系统实现(C语言/C++版本)

    课题描述 编制一个程序,火车票订票的业务活动包括:车次查询、订票、退票、用户管理等。 需求分析 用户信息包括用户姓名、身份证号、用户电话、用户所购列车号、订单号;列车信息包括:列车车站号、车票起点、车票终点、出发时间、到达时间、票价、票数等基本信

    2024年01月19日
    浏览(43)
  • 数据结构上机实验——栈和队列的实现、栈和队列的应用、进制转换、约瑟夫环问题

      1.利用栈的基本操作实现将任意一个十进制整数转化为R进制整数。   2.利用循环队列实现.约瑟夫环问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人出圈;他的下一个人又从1开始报数,数到k的那个人出圈;依

    2024年02月08日
    浏览(33)
  • 经典TopK问题、优先级队列 与 堆的纠葛一文为你解惑——数据结构

    前言: 本篇文章以 TopK 问题为引,具体阐述了 PriorityQueue 实现的基本逻辑——堆 数据结构,以及PriorityQueue 的常用方法。如有问题欢迎看官朋友指正,如果觉得文章还不错的话,求点赞、收藏、评论 三连。 重点: 堆的基本实现逻辑 PriorityQueue 运用和源码分析 TopK 问题的解法

    2023年04月22日
    浏览(38)
  • 【数据结构和算法】--队列的特殊结构-循环队列

    循环队列是队列的一种特殊结构,它的 长度是固定的 k ,同样是 先进先出 ,理论结构是 首尾相连的环形循环结构 。其理论结构大致如下: 具体结构描述可以参考 LeetCode : 622. 设计循环队列的题目要求,大致如下: 设计你的循环队列实现。 循环队列是一种 线性数据结构 ,

    2024年02月04日
    浏览(40)
  • 【数据结构-队列】队列介绍

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月09日
    浏览(35)
  • 【数据结构-队列】阻塞队列

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月09日
    浏览(29)
  • 数据结构01-线性结构-链表栈队列-队列篇

    本系列为C++数据结构系列,会介绍 线性结构,简单树,特殊树,简单图等。本文为线性结构部分。 线性结构 【 3 】链表:单链表、双向链表、循环链表 【 3 】栈 【 3 】队列 队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点: (1)队列中的数据元素遵循“先进

    2024年02月16日
    浏览(31)
  • 【数据结构-队列】双端队列

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月09日
    浏览(32)
  • 数据结构--队列与循环队列

            队列是什么,先联想一下队,排队先来的人排前面先出,后来的人排后面后出;队列的性质也一样,先进队列的数据先出,后进队列的后出;就像图一的样子:  图1         如图1,1号元素是最先进的,开始出队时,那么他就是最先出的,然后12进队,就应该排在最

    2024年02月10日
    浏览(35)
  • 数据结构—循环队列(环形队列)

    循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且 队尾被连接在队首之后以形成一个循环 。它也被称为“ 环形缓冲器 ”。 循环队列的一个好处是可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素

    2024年02月11日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包