1. 程式人生 > >給定入棧序列1到n,輸出所有可能的出棧序列

給定入棧序列1到n,輸出所有可能的出棧序列

package com.test;

import java.util.Stack;

public class StackSequence {

	public static int number=0;
	 static Stack<Integer> stack=new Stack<Integer>();//儲存入棧的元素
     static int[] array=new int[10];//儲存輸出的元素
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		print_valid_sequence(1,4);
	}

	//入棧順序1到n,輸出所有的出棧序列
	public static void print_valid_sequence(int i, int n )
	 {
	     
	    
	     int top;//用來取top
	     if(i == n+1)//遞迴結束條件,輸出序列
	     {
	         ++number;
	         System.out.println(number+"——————");
	         //輸出陣列中的元素
	         for(int j = 0;j < n-stack.size();++j)
	        	 System.out.print(array[j]+"-");//正序輸出
	         //輸出棧中剩下的元素
	         for(int k=stack.size()-1;k>=0;k--)
	         {
	        	 System.out.print(stack.get(k));
	         }
	         System.out.println();
	    }
	    else
	    {
	        stack.push(i);//入棧
	        print_valid_sequence(i+1,n);
	        stack.pop();//為保持stack不變,出棧
	 
	        if(!stack.empty())//將棧頂元素輸出
	        {
	            top=stack.peek();
	            array[i-stack.size()-1] = top;//將輸出的元素放入array中
	            stack.pop();
	            print_valid_sequence(i,n);//i不變
	            stack.push(top);
	        }
	    }
	}
}


輸出:

1——————
4321
2——————
3-421
3——————
3-2-41
4——————
3-2-1-4
5——————
2-431
6——————
2-3-41
7——————
2-3-1-4
8——————
2-1-43
9——————
2-1-3-4
10——————
1-432
11——————
1-3-42
12——————
1-3-2-4
13——————
1-2-43
14——————
1-2-3-4