码迷,mamicode.com
首页 > 其他好文 > 详细

华为OJ铁路栈问题(分析+源码)

时间:2015-04-30 10:43:37      阅读:428      评论:0      收藏:0      [点我收藏+]

标签:

题目标题:铁路栈问题 

铁路的调度站如下:

技术分享

火车编号为:1~9,且不重复。

如:编号分别为“1”、“2”、“3”、“4”、“5”的5个火车顺序进站,那么进站序列为“12345”,全部进站后再顺序出站,则出站序列为“54321”,如果先进1,2,然后2出站,然后1出站,然后再3进站、出站,4进站、出站,5进站、出站,那么出站序列就为21345.

详细描述:   

int JudgeTrainSequence (int maxNum, char *pOutSeq);

输入参数:

    int maxNum:进站的火车最大编号

    char* pOutSeq:使用字符串表示火车出站序列

输出参数(指针指向的内存区域保证有效):

    无。

返回值:

    Int: 根据输入的进站序列判断,如果输入的出站序列是可能的,返回1,否则返回0;


分析+代码:

       这个题目已经提示是栈的问题,有点数据结构基础的娃儿就知道这个入栈出栈的操作,关键的地方在于对于某一个序号n入栈,则如果有小于n的数还没有出栈,那么它们出栈以后必然是降序排列的。对于每一个数都是如此,然而对于本题太过简单,最快最暴力的方法就是模拟栈操作,这也是ACMer知道的经典的数据结构算法,你可以利用STL里已经定义好的stack操作,对于本题因为入栈从1开始编号,而且是顺序的,也就是说入栈序列是不变的,所以用个数组就可以模拟它,首先编号1入栈(放入数组每一个元素),然后从数组的当前位置开始向前走,依次比较和出栈序列的相应元素是否相等,直到不相等的时候,放入编号2.....类似,代码很简单,容易看懂,时间复杂度是O(n^2),没时间优化,欢迎回帖交流~

//#include<iostream>
//#include<string>
//#include<algorithm>
//#include<cmath>
//#include<vector>
//#include<stack>
//#include<iomanip>
//using namespace std;
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
        
/*
详细描述:   
int JudgeTrainSequence (int maxNum, char *pOutSeq);
输入参数:
	 	int maxNum:进站的火车最大编号
	 	char* pOutSeq:使用字符串表示火车出站序列
输出参数(指针指向的内存区域保证有效):
	 	无。
返回值:
		Int: 根据输入的进站序列判断,如果输入的出战序列是可能的,返回1,否则返回0;

*/

int JudgeTrainSequence (int maxNum, char *pOutSeq)
{
	if(strlen(pOutSeq)!=maxNum)return 0;

	char *ss=(char *)malloc(sizeof(char));
	int i,j=0,k=0;
	for(i=1;i<=maxNum;i++)
	{
		ss[j]=i+'0';
		while(ss[j]==pOutSeq[k] && k<maxNum){
			k++;
			j--;
		}
		if(k==maxNum)return 1;
		j++;
	}
	return 0;
}

int main()
{
	char *ss=NULL;
	printf("%d\n",JudgeTrainSequence (5, "53421"));
//	cout<<JudgeTrainSequence (5, "53421")<<endl;//12345;34215
	return 0;
}



华为OJ铁路栈问题(分析+源码)

标签:

原文地址:http://blog.csdn.net/wljwsj/article/details/45390699

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!