[置頂] 華為OJ鐵路棧問題(分析+源碼)
來源:程序員人生 發布時間:2015-05-27 08:29:20 閱讀次數:6538次
題目標題:鐵路棧問題
鐵路的調度站以下:

火車編號為: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;
分析+代碼:
這個題目已提示是棧的問題,有點數據結構基礎的娃兒就知道這個入棧出棧的操作,關鍵的地方在于對某1個序號n入棧,則如果有小于n的數還沒有出棧,那末它們出棧以后必定是降序排列的。對每個數都是如此,但是對本題太過簡單,最快最暴力的方法就是摹擬棧操作,這也是ACMer知道的經典的數據結構算法,你可以利用STL里已定義好的stack操作,對本題由于入棧從1開始編號,而且是順序的,也就是說入棧序列是不變的,所以用個數組就能夠摹擬它,首先編號1入棧(放入數組每個元素),然后從數組確當前位置開始向前走,順次比較和出棧序列的相應元素是不是相等,直到不相等的時候,放入編號2.....類似,代碼很簡單,容易看懂,時間復雜度是O(n^2),沒時間優化,歡迎回帖交換~
//#include<iostream>
//#include<string>
//#include<algorithm>
//#include<cmath>
//#include<vector>
//#include<stack>
//#include<iomanip>
//using namespace std;
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
/*
詳細描寫:
int JudgeTrainSequence (int maxNum, char *pOutSeq);
輸入參數:
int maxNum:進站的火車最大編號
char* pOutSeq:使用字符串表示火車出站序列
輸出參數(指針指向的內存區域保證有效):
無。
返回值:
Int: 根據輸入的進站序列判斷,如果輸入的出戰序列是可能的,返回1,否則返回0;
*/
int JudgeTrainSequence (int maxNum, char *pOutSeq)
{
if(strlen(pOutSeq)!=maxNum)return 0;
char *ss=(char *)malloc(sizeof(char));
int i,j=0,k=0;
for(i=1;i<=maxNum;i++)
{
ss[j]=i+'0';
while(ss[j]==pOutSeq[k] && k<maxNum){
k++;
j--;
}
if(k==maxNum)return 1;
j++;
}
return 0;
}
int main()
{
char *ss=NULL;
printf("%d
",JudgeTrainSequence (5, "53421"));
// cout<<JudgeTrainSequence (5, "53421")<<endl;//12345;34215
return 0;
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈