根据栈的入栈序列和出栈序列,打印push和pop的顺序-Amazon笔试题

该题目是Amazon的在线技术笔试的题目:java

直接上代码吧,代码中有说明。只要咱们实现calculateOperationSequence()方法就能够了算法

package amazon2;

/* Enter your code here. Read input from STDIN. Print output to STDOUT */
import java.util.*;
import java.util.Stack;
import java.util.StringTokenizer;

/**
 * 根据栈的出栈序列和入栈序列,打印push和pop的顺序,push和pop后面必须跟上元素在originalArray中的位置。好比
 * originalArray:1 2 3 4
 * resultArray:4 3 2 1
 * putput:push1|push2|push3|push4|pop4|pop3|pop2|pop1
 * 
 * 算法思路:
 * stack//存放入栈的元素的值;stackPos:存放入栈的元素在originalArray中的索引
 * while(true){
 * 		if(stack为空){
 * 			if(originalArray中还有元素){
 * 				originalArray中的一个元素入栈stack;
 * 				originalArray中的该元素入栈stackPos;
 * 			}else{
 * 				break;//此时说明
 * 			}
 * 		}else{//栈不空
 * 			if(stack的栈顶元素和resultArray中的当前元素相等){
 * 				pop();
 * 			}else{
 * 				if(originalArray中还有元素){
 * 					originalArray中的一个元素入栈stack;
 * 					originalArray中的该元素入栈stackPos;
 * 				}else{
 * 					return "None";
 * 				}
 * 			}
 * 		}
 * }
 * 
 * @author songjie
 *
 */
public class Solution2 
{
	private String calculateOperationSequence(int[] originalArray, int[] resultArray) 
	{
		// your code is here
		if(originalArray == null || resultArray == null || originalArray.length == 0 || resultArray.length ==0
				|| originalArray.length != resultArray.length){
			throw new IllegalArgumentException("invalid arguments");
		}
		StringBuffer sb = new StringBuffer("");
		
		Stack<Integer> stack = new Stack<Integer>();
		Stack<Integer> stackPos = new Stack<Integer>();
		
		int originalPos = 0;
		int resultPos = 0;
		
		while(true){
			if(stack.isEmpty()){//stack is empty
				if(originalPos>=originalArray.length) break;
				stack.push(originalArray[originalPos]);
				stackPos.push(originalPos++);
				sb.append("push"+originalPos+"|");
			}else{//stack is not empty
				int peek = stack.peek();
				if(resultArray[resultPos] == peek){
					stack.pop();
					sb.append("pop"+(stackPos.pop()+1)+"|");
					resultPos++;
				}else if(originalPos<originalArray.length){
					stack.push(originalArray[originalPos]);
					stackPos.push(originalPos++);
					sb.append("push"+originalPos+"|");
				}else{
					return "None";
				}
			}
		}
		
		return sb.toString().substring(0, sb.length()-1);
	}
	
	public static void main(String[] args) 
	{
		Solution2 solution = new Solution2();
		Scanner scanner = new Scanner(System.in);
		
		while (scanner.hasNextLine()) 
		{
			String strLine1 = scanner.nextLine();
			StringTokenizer stringTokenizer1 = new StringTokenizer(strLine1);
			
			//Initialize the original array
			int arrayLength = stringTokenizer1.countTokens();
			int[] originalArray = new int[arrayLength];
			for(int i = 0; i < arrayLength; i++)
			{
				originalArray[i] = Integer.parseInt(stringTokenizer1.nextToken());
			}
			
			//Initialize the result array
			String strLine2 = scanner.nextLine();
			StringTokenizer stringTokenizer2 = new StringTokenizer(strLine2);
			arrayLength = stringTokenizer2.countTokens();
			int[] resultArray = new int[arrayLength];
			for(int j = 0; j < arrayLength; j++)
			{
				resultArray[j] = Integer.parseInt(stringTokenizer2.nextToken());
			}
			
			String operationSequence = solution.calculateOperationSequence(originalArray, resultArray);
			System.out.println(operationSequence);
		}
	}
}