题目
栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。
示例1:
输入:
[“SortedStack”, “push”, “push”, “peek”, “pop”, “peek”]
[[], [1], [2], [], [], []]
输出:
[null,null,null,1,null,2]
解题思路
方法1:临时栈
- 题目要求只能使用一个临时栈存放数据
- 入栈时,先将栈中大于val的数值暂存到临时栈中
- 将val入栈
- 再将临时栈中的数据push会栈中
方法2:递归
- 不使用额外的数据结构临时存放栈中数据
- 使用递归的局部变量暂存栈中大于val的值
- 递归是出栈、入栈的过程,可以认为是使用了一个内部的临时栈
代码
方法1:
import java.util.Deque;
import java.util.LinkedList;
public class SortedStack {
private Deque<Integer> stack, temp;
public SortedStack() {
stack = new LinkedList<>();
temp = new LinkedList<>();
}
public void push(int val) {
// 栈为空,入栈
if (isEmpty()) stack.push(val);
else {
// 将栈中大于val的值暂存到temp中
while (!stack.isEmpty() && val > stack.peek()) {
temp.push(stack.pop());
}
// 入栈
stack.push(val);
// 将temp中暂存内容push回来
while (!temp.isEmpty()) {
stack.push(temp.pop());
}
}
}
public void pop() {
if (stack.isEmpty()) return;
stack.pop();
}
public int peek() {
if (stack.isEmpty()) return -1;
return stack.peek();
}
public boolean isEmpty() {
return stack.isEmpty();
}
}
方法2:
import java.util.Deque;
import java.util.LinkedList;
public class SortedStack {
private Deque<Integer> stack;
public SortedStack() {
stack = new LinkedList<>();
}
public void push(int val) {
// 如果栈为空或者val小于栈顶元素,入栈
if (isEmpty() || val <= peek()) stack.push(val);
else {
// val大于栈顶元素,val继续和栈中下一个元素比较
int temp = stack.pop();
push(val);
// 将出栈的数据依次入栈
stack.push(temp);
}
}
public void pop() {
if (stack.isEmpty()) return;
stack.pop();
}
public int peek() {
if (stack.isEmpty()) return -1;
return stack.peek();
}
public boolean isEmpty() {
return stack.isEmpty();
}
}