题目描述
一个栈中元素的类型为整型,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈。除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序?
输入描述:
第一行输入一个N,表示栈中元素的个数
第二行输入N个整数
a
i
a_i
ai 表示栈顶到栈底的各个元素
输出描述:
输出一行表示排序后的栈中栈顶到栈底的各个元素。
示例1
输入
5
5 8 4 3 6
输出
8 6 5 4 3
备注:
1 <= N <= 10000
-1000000 <= a n a_n an <= 1000000
Solution
这一题其实不难,我们用一个辅助栈help
来辅助排序,目标是让help
栈从上到下排序成从小到大,这样我们把help
栈倒到stack
中时,栈顶到栈底就会变成从大到小的顺序。
每一次取stack
的栈顶作为cur
,然后判断cur
和help
栈的栈顶孰大孰小,若比help
的栈顶小,那么我们直接压入help
栈即可;若比help
的栈顶大,我们就得将当前help
的栈顶弹出到stack
栈中,然后继续比较,直到可以压入cur
。
import java.util.*;
public class Main{
public static void sortStack(Stack<Integer> stack) {
Stack<Integer> help = new Stack<>();
while (!stack.isEmpty()) {
int cur = stack.pop(); // 取 stack 的栈顶
while (!help.isEmpty() && cur > help.peek()) {
stack.push(help.pop());
}
help.push(cur);
}
while (!help.isEmpty()) {
stack.push(help.pop());
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for (int i = n - 1; i >= 0; i--) {
arr[i] = scanner.nextInt();
}
// for (int i = 0; i < n; i++) { // 错误示范: case通过率为95.24%
// arr[i] = scanner.nextInt();
// }
Stack<Integer> stack = new Stack();
for (int item : arr) {
stack.push(item);
}
sortStack(stack);
while (!stack.isEmpty()) {
System.out.print(stack.pop() + " ");
}
}
}