题目
栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作:push、pop、peek 和 isEmpty。当栈为空时,peek 返回 -1。
示例
输入:
[“SortedStack”, “push”, “push”, “peek”, “pop”, “peek”]
[[], [1], [2], [], [], []]
输出:
[null,null,null,1,null,2]
相当于 创建有序栈,push(1),push(2),peek(),pop(),peek()
返回结果:[null,null,null,1,null,2]
思路
题目中已经提示可以使用临时栈来存放数据。因此创建一个主栈stack,创建一个辅助栈helper,辅助栈用来存放比当前添加元素小的元素。
push操作时,如果stack不为空,当前元素大于栈顶元素,将栈顶元素加入helper,依次比较stack栈顶元素和待添加的元素大小,直到添加的元素小于等于stack的栈顶元素。然后将待添加元素入栈,将helper中的元素依次弹出放入stack中。
代码实现
class SortedStack {
private Deque<Integer> stack;
private Deque<Integer> helper;
public SortedStack() {
stack = new LinkedList<>();
helper = new LinkedList<>();
}
public void push(int val) {
//先将栈中小于待添加元素的值都移到辅助站中
while (!stack.isEmpty()&&stack.peek()<val){
helper.push(stack.pop());
}
//这时stack中栈顶元素已经大于等于val,符合栈顶是最小值条件
//添加val到stack中
stack.push(val);
//将小于val的辅助栈中的元素都添加到stack
while (!helper.isEmpty()){
stack.push(helper.pop());
}
}
public void pop() {
if(!stack.isEmpty()){
stack.pop();
}
}
public int peek() {
return isEmpty()?-1:stack.peek();
}
public boolean isEmpty() {
return stack.isEmpty();
}
}