華爲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;
}



思路很簡單,如果出棧的元素存在於入站的隊列中但是該元素不是棧頂元素,那麼該出棧隊列不可能存在。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章