题目
面试题 03.05. 栈排序
栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。
示例1:
输入:
[“SortedStack”, “push”, “push”, “peek”, “pop”, “peek”]
[[], [1], [2], [], [], []]
输出:
[null,null,null,1,null,2]
示例2:
输入:
[“SortedStack”, “pop”, “pop”, “push”, “pop”, “isEmpty”]
[[], [], [], [1], [], []]
输出:
[null,null,null,null,null,true]
说明:
栈中的元素数目在[0, 5000]范围内。
题目描述了可以额外使用一个栈,实际上我们可以通过一个临时栈来暂存数据,来相互倒腾一下,保持有序。代码如下:
public class P0305 {
class SortedStack {
private Deque<Integer> stack;
private Deque<Integer> temp;
public SortedStack() {
stack = new ArrayDeque<>();
temp = new ArrayDeque<>();
}
public void push(int val) {
while (!stack.isEmpty() && val > stack.peek()) {
Integer pop = stack.pop();
temp.push(pop);
}
stack.push(val);
while (!temp.isEmpty()) {
stack.push(temp.pop());
}
}
public void pop() {
if (!stack.isEmpty()) {
stack.pop();
}
}
public int peek() {
return stack.isEmpty() ? -1 : stack.peek();
}
public boolean isEmpty() {
return stack.isEmpty();
}
}
}
这里面显示使用了两个栈, 还有一种解法使用递归替代一个栈,这个思路比较像递归:如何逆序一个栈(递归: 如何逆序一个栈(不使用其余数据结构))。代码如下:
public class P03052 {
class SortedStack {
private Deque<Integer> stack;
public SortedStack() {
stack = new ArrayDeque<>();
}
public void push(int val) {
// 直接可以入栈的
if (!stack.isEmpty() && val <= stack.peek()) {
stack.push(val);
return;
}
if (stack.isEmpty()) {
stack.push(val);
return;
}
// 递归的进行栈排序
Integer pop = stack.pop();
push(val);
stack.push(pop);
}
public void pop() {
if (!stack.isEmpty()) {
stack.pop();
}
}
public int peek() {
return stack.isEmpty() ? -1 : stack.peek();
}
public boolean isEmpty() {
return stack.isEmpty();
}
}
}