打印所有出栈序列(指定进栈序列的顺序)

  • 所有出栈序列
package ccnu.allTest;

import java.util.ArrayList;
import java.util.Stack;

public class PrintPopSerial {
    public static void main(String[] args) {
        ArrayList<String> pops = popSerials(new char[]{'a', 'b', 'c', 'd'}, 0);
        int i = 0;
        for(String pop : pops){
            i++;
            System.out.println("第" + i + "个: " + pop);
        }
    }

    // push为指定的入栈字符,并且顺序从前至后依次入栈,begin为入栈序列的开始索引
    // 返回所有可能的出栈序列
    public static ArrayList<String> popSerials(char[] push, int begin){
        return popSerials(push, begin, new Stack<Character>(), new StringBuilder());
    }

    private static ArrayList<String> popSerials(char[] push, int begin, Stack<Character> s, StringBuilder sb){
        ArrayList<String> pops = new ArrayList<String>();
        if(push == null){
            return null;
        }
        s.push(push[begin]); // 将还没有入栈的字符序列的第一个字符入栈
        begin++;
        if(begin == push.length){ // 全部字符均已入栈
            while(!s.isEmpty()){
                sb.append(s.pop());
            }
            pops.add(sb.toString());
        }else{
            // 进栈
            pops.addAll(popSerials(push, begin, (Stack<Character>)s.clone(), new StringBuilder(sb))); // 当前栈中的数据要递交给下一层使用,但要保证其中的数据不会被改变,当前已出栈字符保存在sb中,但要保证下一层调用使用它但不会改变本层的当前值,因此均要复制一份
            while(!s.isEmpty()){
                sb.append(s.pop()); // 出栈
                // 进栈
                pops.addAll(popSerials(push, begin, (Stack<Character>)s.clone(), new StringBuilder(sb)));
            }
        }
        return pops;
    } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值