说实话,华为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; }
思路很简单,如果出栈的元素存在于入站的队列中但是该元素不是栈顶元素,那么该出栈队列不可能存在。