072.火车车厢重排

Posted 程序员编程指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了072.火车车厢重排相关的知识,希望对你有一定的参考价值。

#include "stdafx.h"
#include "stdio.h"
#include "iostream.h"
#include "stdlib.h"
#include "malloc.h"
#include "string.h"
#define StackSize 100 //假定预分配的栈空间最多为100个元素 
#define MaxLength  100// 最大的字符串长度 	
typedef int DataType;//假定栈元素的数据类型为整数 	
typedef struct
	DataType data[StackSize];
	int top;
SeqStack;   

// 置栈空
void Initial(SeqStack *S)
//将顺序栈置空
	S->top=-1;
 
//判栈空
int IsEmpty(SeqStack *S)

	return S->top==-1;

//判栈满
int IsFull(SeqStack *S)

	return S->top==StackSize-1;

//进栈
void Push(SeqStack *S,DataType x)

	if (IsFull(S))
	
		printf("栈上溢"); //上溢,退出运行
		exit(1);
	
	S->data[++S->top]=x;//栈顶指针加1后将x入栈

//出栈
DataType Pop(SeqStack *S)

	if(IsEmpty(S))
	
		printf("栈为空"); //下溢,退出运行
		return -1;
	
	return S->data[S->top--];//栈顶元素返回后将栈顶指针减1

// 取栈顶元素
DataType Top(SeqStack *S)

	if(IsEmpty(S))
	
		printf("栈为空"); //下溢,退出运行
		exit(1);
	
	return S->data[S->top];

int  Hold(int c,int *minH, int *minS,SeqStack H[],int k, int n)
// 在一个缓冲铁轨中放入车厢c
	// 如果没有可用的缓冲铁轨,则返回0
	// 如果空间不足,则引发异常N o M e m
	// 否则返回1
	// 为车厢c寻找最优的缓冲铁轨
	// 初始化
	int BestTrack = 0,i; // 目前最优的铁轨
	int BestTop = n + 1;// 最优铁轨上的头辆车厢
	int x;// 车厢索引
	//扫描缓冲铁轨
	for (i = 1; i <= k; i++)
		if (IsEmpty(&H[i])) 
		// 铁轨i 不空
			x = Top (&H[i]) ;
			if (c<x && x < BestTop)
			//铁轨i 顶部的车厢编号最小
				BestTop = x;
				BestTrack = i;
			
		
		else // 铁轨i 为空
			if (!BestTrack) 
				BestTrack = i;
			if (!BestTrack) 
				return 0; //没有可用的铁轨
			//把车厢c 送入缓冲铁轨
			Push(&H[BestTrack],c);
			printf("Move car %d  from input to holding track %d\\n" ,c, BestTrack);
			//必要时修改minH 和minS
			if (c<*minH) 
				*minH = c; 
				*minS = BestTrack; 
			
			return 1;

void Output(int* minH, int* minS, SeqStack H[ ], int k, int n)
 //把车厢从缓冲铁轨送至出轨处,同时修改m i n S和m i n H
	int c,i; // 车厢索引
	// 从堆栈m i n S中删除编号最小的车厢minH
	c=Pop(&H[*minS]) ;
	printf("Move car %d from holding track %d to output\\n",*minH,*minS);
	// 通过检查所有的栈顶,搜索新的m i n H和m i n S
	*minH=n+2;
	for (i = 1; i <= k; i++)
		if (!IsEmpty(&H[i]) && (c=Top(&H[i])) < *minH) 
			*minH = c;
			*minS = i;
		

int Railroad(int p[], int n, int k)
// k个缓冲铁轨,车厢初始排序为p [1:n]
	// 如果重排成功,返回1,否则返回0
	// 如果内存不足,则引发异常NoMem 。
	//创建与缓冲铁轨对应的堆栈
	SeqStack *H;
	int NowOut = 1; //下一次要输出的车厢
	int minH =n+1; //缓冲铁轨中编号最小的车厢
	int minS,i; //minH号车厢对应的缓冲铁轨
	H=(SeqStack*)calloc((k+1),sizeof(SeqStack)*(k+1));
	//车厢重排
	for (i = 1; i<= n; i++)
		if (p[i] == NowOut) // 直接输出t
			printf("移动车厢%d从出口到入口",p[i]);
			NowOut++;
			//从缓冲铁轨中输出
			while (minH == NowOut) 
				Output(&minH, &minS, H, k, n);
				NowOut++;
			
		
		else // 将p[i] 送入某个缓冲铁轨
			if (!Hold(p[i], &minH, &minS, H, k, n))
				return 0;
		
		return 1;

void main(void)

	int p[8]=2,4,1,6,5,3,8,7;
	Railroad(p,8,4);

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于072.火车车厢重排的主要内容,如果未能解决你的问题,请参考以下文章

车厢调度

Uva 514-铁轨 Rails

车厢调度(train.cpp)

GRYZ 模 拟 赛 系 列 Xxy 的车厢调度

(考试大整理~)Xxy 的车厢调度x

数据结构练习专题