标签:
用ArrayList模拟栈的操作,采用递归算法。代码如下:
1 import java.util.ArrayList; 2 import java.util.Scanner; 3 4 public class stackAll { 5 static int num=0; 6 public static void main(String[] args) { 7 Scanner scanner=new Scanner(System.in); 8 int n=scanner.nextInt();//输入元素个数 9 ArrayList<Integer> stackIn=new ArrayList<Integer>(); 10 for(int i=n;i>0;i--)//初始化入栈队列 11 stackIn.add(i); 12 13 long start=System.currentTimeMillis(); 14 stackOut(stackIn,new ArrayList<Integer>(),new ArrayList<Integer>());//调用递归 15 System.out.println(num);//最终完成后输出总数 16 System.out.println((System.currentTimeMillis()-start)/1000f);//时间消耗计算 17 } 18 19 public static void stackOut(ArrayList<Integer> stackIn,ArrayList<Integer> stack,ArrayList<Integer> stackOut){ 20 if(stackIn.size()==0){//入栈队列是否空 21 if(stack.size()==0){//栈是否空 22 for(int x : stackOut)//如果说队列和栈都空,则说明出栈完成,输出出栈队列 23 System.out.print(x+" "); 24 System.out.println(); 25 num++;//进行计数 26 }else{ 27 stackOut.add(stack.get(stack.size()-1));//入栈队列空,栈非空,则只能出栈 28 stack.remove(stack.size()-1); 29 stackOut(stackIn,stack,new ArrayList<Integer>(stackOut)); 30 } 31 }else{ 32 if(stack.size()==0){//入栈队列非空,栈空,则入栈 33 stack.add(stackIn.get(stackIn.size()-1)); 34 stackIn.remove(stackIn.size()-1); 35 stackOut(stackIn,stack,new ArrayList<Integer>(stackOut)); 36 }else{ 37 ArrayList<Integer> stack_copy=new ArrayList<Integer>(stack);//因为下面分两种情况进行回调函数,所以此处将数据复制一份 38 ArrayList<Integer> stackIn_copy=new ArrayList<Integer>(stackIn); 39 40 stack_copy.add(stackIn_copy.get(stackIn_copy.size()-1));//只入栈 41 stackIn_copy.remove(stackIn_copy.size()-1); 42 stackOut(stackIn_copy,stack_copy,new ArrayList<Integer>(stackOut)); 43 44 stackOut.add(stack.get(stack.size()-1));//只出栈 45 stack.remove(stack.size()-1); 46 stackOut(stackIn,stack,new ArrayList<Integer>(stackOut)); 47 } 48 } 49 } 50 }
计算超过14个元素的栈的出栈顺序,时间就开始很长了,每增加1,时间几何级数增长。
其实出栈次序的所有可能就是卡塔兰数,求卡塔兰数几乎不需要时间,非常快,但是卡特兰数只能输出最终结果的总数,不能输出每一个出栈次序的具体数据,所以依情况而使用。
以下附卡塔兰数求解代码。
import java.util.Scanner; public class Main { public static void main(String[] args) { System.out.println(h(new Scanner(System.in).nextLong())); } public static long h(long n){ if(n==1) return 1; else if(n==2) return 2; else return h(n-1)*(4*n-2)/(n+1); } }
标签:
原文地址:http://www.cnblogs.com/mrbeast/p/5480601.html