import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
static List<String> allPopStack = new ArrayList<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int a = in.nextInt();
int[] waStack = new int[a];
for (int i = 0; i < a; i++) {
waStack[i] = in.nextInt();
}
LinkedList<Integer> stackInsert = new LinkedList<>();
for (int i = 0; i < waStack.length; i++) {
stackInsert.add(waStack[i]);
}
visitStack(stackInsert, new Stack<Integer>(), new LinkedList<Integer>(),
waStack.length);
Collections.sort(allPopStack);
for (String s : allPopStack) {
System.out.println(s);
}
}
}
public static void visitStack(LinkedList<Integer> insert, Stack<Integer> stack,
LinkedList<Integer> record, int size) {
//栈已经全部入完
if (record.size() == size) {
//已经全部记录
StringBuilder builder = new StringBuilder();
for (Integer integer : record) {
builder.append(integer).append(" ");
}
allPopStack.add(builder.toString().trim());
return;
}
//入栈, 还有数据可以入栈的时候,才能
if (insert.size() > 0) {
Integer inte = insert.pollFirst();
stack.push(inte);
visitStack(insert, stack, record, size);
// 恢复原貌
insert.addFirst(inte);
//还回去
stack.pop();
}
//出栈
if (stack.size() > 0) {
Integer pop = stack.pop();
record.add(pop);
visitStack(insert, stack, record, size);
stack.push(pop);
record.removeLast();
}
}
}
这个难点是如何 定义三个状态 栈已经全部入完\入栈, 还有数据可以入栈的时候\出栈 并且入栈与出栈的时候需要还原入栈与出栈时候的场景

京公网安备 11010502036488号