杰拉斯的博客

[整理]ACM详解(6)——栈

杰拉斯 杰拉斯 | 时间:2012-02-17, Fri | 6,519 views
编程算法 
堆栈是一种特殊的线性结构,后进先出,只能对栈顶元素操作,典型的操作入栈和出站。下面通过例子介绍基本用法。
题目:

Train Problem

Problem Description
As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to get back to school by train(because the trains in the Ignatius Train Station is the fastest all over the world ^v^). But here comes a problem, there is only one railway where all the trains stop. So all the trains come in from one side and get out from the other side. For this problem, if train A gets into the railway first, and then train B gets into the railway before train A leaves, train A can't leave until train B leaves. The pictures below figure out the problem. Now the problem for you is, there are at most 9 trains in the station, all the trains has an ID(numbered from 1 to n), the trains get into the railway in an order O1, your task is to determine whether the trains can get out in an order O2.
Input
The input contains several test cases. Each test case consists of an integer, the number of trains, and two strings, the order of the trains come in:O1, and the order of the trains leave:O2. The input is terminated by the end of file. More details in the Sample Input.
Output
The output contains a string "No." if you can't exchange O2 to O1, or you should output a line contains "Yes.", and then output your way in exchanging the order(you should output "in" for a train getting into the railway, and "out" for a train getting out of the railway). Print a line contains "FINISH" after each test case. More details in the Sample Output.
Sample Input
3 123 321
3 123 312
Sample Output
Yes.
in
in
in
out
out
out
FINISH
No.
FINISH
题目翻译:火车站非常繁忙,火车A先进站,如果火车B在火车A出站之前进站,则或者A只能等或者B出站之后再出站(后进先出)。题目要求有n(n最大为9,编号从1到n)列火车,给出火车进站的序列,并给出火车出站的序列,让你判断这个要求能否实现,如果能实现写出进站(in)、出站(out)的操作序列。
解题思路:基本原则就是后进先出,但是对于特定的火车来说是先进后出。所以首先考虑入栈的序列,在入栈的过程根据出栈序列判断是否需要出栈,如果不需要出栈,则继续进栈,如果需要出栈则进行出栈操作。如果要出栈的元素不在栈顶则表示序列不合法。下面以入栈序列1234和出栈序列1423进行分析。
考虑入栈:1进栈,栈顶元素为1;
考虑出栈:因为栈顶元素与出栈序列中的第一个元素相同,1出栈,出栈后栈中无元素;
考虑出栈:栈中无元素,所以不用出栈;
考虑入栈:2进栈,栈顶元素为2;
考虑出栈:因为栈顶元素是2,而要出栈的元素是4,所以不能出栈;
考虑入栈:3进栈,栈顶元素为3,栈中包括2和3;
考虑出栈:因为栈顶元素是3,而要出栈的元素是4,所以不能出栈;
考虑入栈:4进栈,栈顶元素为4,栈中包括2、3和4;
考虑出栈:因为栈顶元素是4,而要出栈的元素是4,所以4出栈,出栈后栈中元素为2和3,3为栈顶元素。
考虑出栈:因为栈顶元素是3,而要出栈的元素是2,所以不能出栈;
考虑入栈:所有元素已经入栈,所以不能出栈;
无法入栈也无法出栈,而栈中有元素,所以序列不合法。
下面是参考代码:
/*
 * Train Problem I
 */
public static String test2(int n,String s1,String s2){
	// 记录操作结果
	StringBuffer sb = new StringBuffer();
	// 表示栈
	int[] a=new int[9];
	// 表示栈顶元素
	int index=-1;
	// 入栈元素序号
	int index1=0;
	// 出栈元素序号
	int index2=0;
	// 把第一个元素放到栈中
	index++;
	a[index]=s1.charAt(index1);
	index1++;
	sb.append("in/n");
	// 只要栈中有元素,则处理
	while(index1<s1.length() || index2<s2.length()){
		// 如果栈顶元素是与s2中的元素一致,则出栈
		if(index>-1 && s2.charAt(index2)==a[index]){
			index--;
			sb.append("out/n");
			index2++;
		}else if(index1==s1.length()){ // 不能实现
			break;
		}else{ // 如果否则把s1中的下一个元素加入到栈中
			index++;
			a[index] = s1.charAt(index1);
			index1++;
			sb.append("in/n");
		}
	}
	if(index!=-1){
		return "No./nFINISH/n";
	}else{
		sb.insert(0,"Yes./n");
		sb.append("FINISH/n");
		return sb.toString();
	}
}

如需转载请注明出处:杰拉斯的博客

相关文章

当前暂无评论 »