HJ77 火车进站(java详解)

该程序使用递归方法解决数据结构问题,通过模拟栈和队列操作,分析给定的入栈序列,找出所有可能的合法出栈序列。在每一步中,问题被拆分为入栈和出栈两个子问题,直到栈和队列都为空,将出栈序列添加到结果列表中。最后,程序对结果进行排序并打印。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类似数据结构题,给一个入栈序列,有多少种出栈序列
然后运用递归 第一个问题可以产生两个子问题 入栈和出栈
直至终结条件待入队列为空,待出栈为空,递归终止
代码如下:

public static void main(String[] args){
    Scanner in = new Scanner(System.in);
    int n=in.nextInt();
    //定义代入队列
    Queue<String> queue=new ArrayDeque<>();

    for(int i=0;i<n;i++){
        queue.add(String.valueOf(in.nextInt()));
    }

    //定义栈,后进先出
    Stack<String> stack=new Stack<>();
    //定义出序列,记录从栈中出去的顺序
    List<String> list=new ArrayList<>();
    //定义pop=""为了递归结束后传入出序列里面.
    String pop="";
    //递归上面定义的三个
    res(stack,queue,list,pop);
    //for循环输出list里面的数值
    Collections.sort(list);

    for(String res:list){
        String[] strr=res.split(" {1,}");
        for(int i=0;i<= strr.length-1;i++){
            if(i!=strr.length-1)
            System.out.print(strr[i]+" ");
            else System.out.println(strr[i]);
        }
    }
    }

    public static void res(Stack<String> stack,Queue<String> queue,List<String> list,String pop){
        //如果当前某个子问题的待出栈以及待入队列全是空的就说明没有可以出的了,结束递归,把出栈序列pop存入list里面
        if(queue.isEmpty()&&stack.isEmpty()){
            list.add(pop);
            return;
        }
        //给当前文字划分两个子问题,是入栈还是出栈,这个if我给的是入栈
        if(!queue.isEmpty()){
            Queue<String> queue1=new ArrayDeque<>(queue);
            Stack<String> stack1=(Stack<String>) stack.clone();
            stack1.push(queue1.poll());
            res(stack1,queue1,list,pop);
        }
        //给当前文字划分两个子问题,是入栈还是出栈,这个if我给的是出栈
        if(!stack.isEmpty()){
            Queue<String> queue1=new ArrayDeque<>(queue);
            Stack<String> stack1=(Stack<String>) stack.clone();
            pop=pop+stack1.pop()+" ";
            res(stack1,queue1,list,pop);
        }
    }

总结:最重要的是list一直没有变,而生成的子问题栈和队列一直在变,直至为空添加进list里面.理解到这个层面,这道题你就很okkk喽.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值