标签:
题目标题:铁路栈问题
铁路的调度站如下:
火车编号为: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;
分析+代码:
这个题目已经提示是栈的问题,有点数据结构基础的娃儿就知道这个入栈出栈的操作,关键的地方在于对于某一个序号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\n",JudgeTrainSequence (5, "53421")); // cout<<JudgeTrainSequence (5, "53421")<<endl;//12345;34215 return 0; }
标签:
原文地址:http://blog.csdn.net/wljwsj/article/details/45390699