您的位置:首页 > 其它

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

2016-02-05 12:55 302 查看
说实话,华为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;
}


思路很简单,如果出栈的元素存在于入站的队列中但是该元素不是栈顶元素,那么该出栈队列不可能存在。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: