說實話,華爲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;
}
思路很簡單,如果出棧的元素存在於入站的隊列中但是該元素不是棧頂元素,那麼該出棧隊列不可能存在。