uva514

思路:根据题意明显C是一个栈,整个模拟是由两种情况构成的

从A->C和从C->B,例如要求顺序是[5,4,1,2,3],A中的原顺序是[1,2,3,4,5],那么接下来有两个操作,如果B要求的第一个等于A中的第一个,那么直接从A->B,否则

如果C的栈顶等于B要求的第一个,那么C->B

如果都不是,那么只能A->C了

如果以上都不成立,也就是说A里面已经没有数据了,那说明该要求顺序是不可能出现的


关键是A,B的模拟,这里只用了两个整数就模拟出来了

package test;

import java.util.Scanner;
import java.util.Stack;



public class Test{	
	
	public static void main(String[] args) {
		int n = 0;		
		
		Stack stack = new Stack();
			
		Scanner sc = new Scanner(System.in);
		int index = 0;
		System.out.println("input:");
		n = sc.nextInt();
		int[] target = new int[n+1];
		int i=1;
		while(!"".equals((index=sc.nextInt())) && index!=0){
			target[i] = index;
			i++;
		}	
		
		sc.close();
		
		boolean ok = true;
		int B = 1,A = 1;
		while(B<=n){
			if(A==target[B]){//如果A的第一个等于当前目标,直接从A->C->B
				B++;A++;
			}else if(!stack.empty() && stack.peek()==target[B]){//如果C的顶部等于当前目标,C->B
				B++;stack.pop();
			}else if(A <= n){//如果A还有数据,A->B
				stack.push(A++);
			}else{//以上都不成立,则可判断失败
				ok = false;				
				break;
			}
		}
		if(ok){
			System.out.println("成功");
		}else{
			System.out.println("失败");
		}
	}
}


你可能感兴趣的:(java,算法与数据结构)