华为OJ 高级题(一) 铁路栈问题

说实话,华为Oj上的题目分级并不是完全合理,像这道铁路栈问题,其实就是一道判断出栈队列是否可能的数据结构题,最多也就是一道中级题吧,可我居然在高级题分类里找到它。


题目标题:铁路栈问题 

铁路的调度站如下:


火车编号为: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;

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;


/*
详细描述:   
int JudgeTrainSequence (int maxNum, char *pOutSeq);
输入参数:
	 	int maxNum:进站的火车最大编号
	 	char* pOutSeq:使用字符串表示火车出站序列
输出参数(指针指向的内存区域保证有效):
	 	无。
返回值:
		Int: 根据输入的进站序列判断,如果输入的出战序列是可能的,返回1,否则返回0;

*/

int JudgeTrainSequence (int maxNum, char *pOutSeq)
{
	string str(pOutSeq);
	int strLen = str.length();
	if(strLen!=maxNum)
		return 0;
	vector<int> trainVector;
	if(maxNum<1||maxNum>9)
		return 0;
	int index = 0;
	char c = pOutSeq[index];
	int nOut = 0;
	if(c>='1'&&c<='9')
		nOut = c-'0';
	else
		return 0;

	for(int i=1;i<=maxNum;i++){
		//如果进站的火车刚好等于下一个出站的火车
		if(nOut==i){
			//循环,出站,直至下一个出站火车不在入站火车中或者判断到出站队列不可能
			while(true){
				//获取下一个出站的火车
				index++;
				if(index>=strLen)
					break;
				c = pOutSeq[index];
				nOut = 0;
				if(c>='1'&&c<='9')
					nOut = c-'0';
				else
					return 0;
				//判断下一个出栈的火车在不在栈中
				vector<int>::iterator result = find( trainVector.begin( ), trainVector.end( ), nOut ); 
				//如果在
				if(result!=trainVector.end()){
					//判断栈的顶部是不是要出栈的火车
					//如果是
					if(nOut==trainVector.back()){
						trainVector.pop_back();//出站
					}else{
						return 0;
					}
				}else{
					break;
				}
			}
			
		}else{
			trainVector.push_back(i);
		}
	}
	//遍历完后,入站火车为空,说明出站队列可行
	if(trainVector.empty())
		return 1;
	return 0;
}



思路很简单,如果出栈的元素存在于入站的队列中但是该元素不是栈顶元素,那么该出栈队列不可能存在。

你可能感兴趣的:(华为,OJ,铁路栈)