1. 程式人生 > >根據入棧順序求出棧順序

根據入棧順序求出棧順序

題目描述:給定一個序列B表示入棧的順序,求所有的不可能出棧順序和可能的出棧順序
題目分析:當一個元素出棧後,緊著接著出棧的元素可以是該元素後面的任意一個元素,或者是該元素前面的離該元素最近的一個未出棧元素。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;


public class T1 {

    public static void main(String[] args) 
    {
        Scanner in=new
Scanner(System.in); int n=in.nextInt(); int[] b=new int[n]; used=new boolean[n]; for(int i=0;i<n;i++) { b[i]=in.nextInt(); } int[] a=new int[n]; dfs(a, 0, n, b); System.out.println("不滿足:"); for(String str:list) { System.out.println(str
); } System.out.println("滿足"); for(String str:list2) { System.out.println(str); } } static boolean[] used; static List<String> list=new ArrayList<>(); static List<String> list2=new ArrayList<>(); static void
dfs(int[] a,int index,int n,int[] b)//用dfs遍歷所有的序列組合 { if(index>=n) { if(!judge(a, b)) { String str=Arrays.toString(a); list.add(str); }else { String str=Arrays.toString(a); list2.add(str); } return; } for(int i=0;i<n;i++) { if(used[i]) continue; a[index]=b[i]; used[i]=true; dfs(a, index+1, n, b); used[i]=false; } } static boolean judge(int[] a,int[] b)//b:入棧順序,a:出棧順序 { //假設序列的最大值不超過100 int[] idx=new int[100]; boolean[] vis=new boolean[100]; for(int i=0;i<b.length;i++) { idx[b[i]]=i; } int pre=idx[a[0]]; vis[pre]=true; for(int i=1;i<a.length;i++) { if(idx[a[i]]>pre) { pre=idx[a[i]]; vis[pre]=true; continue; } for(int j=pre-1;j>=0;j--) { if(vis[j]) continue; if(a[i]==b[j]) { pre=j; vis[j]=true; break; }else return false; } } return true; } }