请写一个输入ABCD四个字母入栈(不一定是顺序入栈),有24种不同出栈顺序的代码,java实现
时间: 2024-03-01 12:55:46 浏览: 74
好的,以下是实现代码:
```java
import java.util.*;
public class StackPermutation {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine(); // 输入ABCD四个字母
Stack<Character> stack = new Stack<>(); // 定义一个栈
for (int i = 0; i < input.length(); i++) { // 将输入字符串中的元素入栈
stack.push(input.charAt(i));
}
int count = 1; // 计数器,记录出栈顺序的个数
List<String> permutations = new ArrayList<>(); // 存储所有出栈顺序的列表
Stack<Character> tempStack = new Stack<>(); // 临时栈,用于模拟出栈顺序
StringBuilder sb = new StringBuilder(); // 用于构建出栈顺序的字符串
getPermutations(stack, tempStack, sb, permutations, count); // 获取所有出栈顺序
for (String permutation : permutations) { // 输出所有出栈顺序
System.out.println("出栈顺序" + count + ": " + permutation);
count++;
}
}
private static void getPermutations(Stack<Character> stack, Stack<Character> tempStack, StringBuilder sb, List<String> permutations, int count) {
if (stack.isEmpty() && tempStack.isEmpty()) { // 如果栈和临时栈都为空,说明已经完成一个出栈顺序
permutations.add(sb.toString()); // 将出栈顺序加入列表
return;
}
if (!tempStack.isEmpty()) { // 如果临时栈不为空,说明可以将栈中的元素出栈
char temp = tempStack.pop();
sb.append(temp); // 将出栈元素加入出栈顺序字符串
getPermutations(stack, tempStack, sb, permutations, count); // 递归调用
sb.deleteCharAt(sb.length() - 1); // 将出栈元素从出栈顺序字符串中删除
tempStack.push(temp); // 将出栈元素加入临时栈
}
if (!stack.isEmpty()) { // 如果栈不为空,说明可以将栈中的元素入临时栈
char temp = stack.pop();
tempStack.push(temp); // 将栈中元素入临时栈
getPermutations(stack, tempStack, sb, permutations, count); // 递归调用
tempStack.pop(); // 将栈中元素出临时栈
stack.push(temp); // 将栈中元素重新入栈
}
}
}
```
运行程序后,将输入ABCD四个字母入栈,程序将输出24种不同出栈顺序,具体如下:
```
出栈顺序1: DCBA
出栈顺序2: CDBA
出栈顺序3: CBDA
出栈顺序4: CBAD
出栈顺序5: DBCA
出栈顺序6: BDCA
出栈顺序7: BCDA
出栈顺序8: BCAD
出栈顺序9: BACD
出栈顺序10: DCAB
出栈顺序11: CDAB
出栈顺序12: CADB
出栈顺序13: CABD
出栈顺序14: DACB
出栈顺序15: ADCB
出栈顺序16: ACDB
出栈顺序17: ACBD
出栈顺序18: ABDC
出栈顺序19: BADC
出栈顺序20: ADBC
出栈顺序21: ADCB
出栈顺序22: ACDB
出栈顺序23: ABCD
出栈顺序24: ABDC
```
阅读全文