码迷,mamicode.com
首页 > 其他好文 > 详细

递归输出所有出栈次序及卡塔兰数应用

时间:2016-05-11 09:32:50      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

用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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!