给定入栈顺序,求所有可能的出栈顺序(JAVA实现)

import java.util.Scanner;

//给定入栈顺序,求所有出栈顺序
public class OutputStack {
//	思路:每个时刻,当前栈都有两种选择,继续入栈,或者出栈。因此,用递归就可以实现了。
	static void all_order(String in,String stack,String out)
    {
		//字符为空且栈为空,输出字符
        if(in.equals("")&&stack.equals(""))
            System.out.println(out);
        //如果字符未全部入栈,入栈
        if(!in.equals(""))
//        	模拟入栈的话,假设第一个入栈了,那么剩余输入字符就是(1,in.length()),栈里面就是stack+in.charAt(0)
            all_order(in.substring(1,in.length()),stack+in.charAt(0),out);
        //如果栈不空,选择出栈
        if(!stack.equals(""))
//        	模拟出栈的话,输入不变,栈里面就是(0,stack.length()-1),输出字符就是out加栈中最后一个字符
            all_order(in,stack.substring(0,stack.length()-1),out+stack.charAt(stack.length()-1));
    }
    public static void main(String[] args) {
    	Scanner input = new Scanner(System.in);
		String a=input.nextLine();
        all_order(a,"","");
    }
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Java 实现获取所有可能出栈顺序的示例代码: ```java import java.util.ArrayList; import java.util.List; import java.util.Stack; public class StackExample { public static void main(String[] args) { String[] input = {"a", "b", "c", "d"}; List<List<String>> output = getPermutations(input); // 输出所有可能出栈顺序 for (List<String> permutation : output) { System.out.println(permutation); } } // 获取所有可能出栈顺序 public static List<List<String>> getPermutations(String[] input) { List<List<String>> output = new ArrayList<>(); Stack<String> stack = new Stack<>(); getPermutations(input, 0, stack, new ArrayList<>(), output); return output; } private static void getPermutations(String[] input, int index, Stack<String> stack, List<String> current, List<List<String>> output) { if (index == input.length && stack.isEmpty()) { output.add(new ArrayList<>(current)); return; } if (!stack.isEmpty()) { String popped = stack.pop(); current.add(popped); getPermutations(input, index, stack, current, output); current.remove(current.size() - 1); stack.push(popped); } if (index < input.length) { stack.push(input[index]); getPermutations(input, index + 1, stack, current, output); stack.pop(); } } } ``` 在上面的示例中,我们首先定义了输入数组 `input`,其中包含了要入栈的元素。然后,我们使用 `getPermutations()` 方法获取所有可能出栈顺序,并将结果存储在 `output` 变量中。 在 `getPermutations()` 方法中,我们使用递归算法来生成所有的出栈顺序。我们定义了一个栈 `stack` 和一个列表 `current`,其中 `stack` 存储了当前的栈状态,`current` 存储了当前的出栈顺序。 在每一次递归中,我们有两种选择:要么弹出栈顶元素,要么将下一个元素入栈。如果当前栈不为空,我们可以弹出栈顶元素,并将其添加到 `current` 列表中,然后继续递归。递归完成后,我们需要将弹出的元素重新压回栈中,并从 `current` 列表中删除。 如果当前栈为空,或者我们已经弹出了所有元素,那么我们可以将下一个元素入栈并继续递归。递归完成后,我们需要将入栈的元素弹出。 最终,当递归完成并且栈为空时,我们将当前的出栈顺序添加到 `output` 列表中。我们将 `current` 列表复制一份并添加到 `output` 列表中,以避免在之后的递归中对其进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值