[编程题] lc:面试题 03.05. 栈排序
题目描述
输入输出
思路
主要思路:
利用一个辅助栈来帮助在插入一个元素的时候进行排序,使得我们的主栈内元素始终是有序的(栈底到栈顶大到小),当push一个元素到主栈的时候,实在先看主栈栈顶元素。
- 如果栈顶元素小于当前val,利用辅助栈将主栈栈顶元素先压入辅助栈,看此时的主栈的栈顶元素与要插入元素val的大小,满足栈顶元素大于val了的话,就可以把val放入到主栈中了、
- 把val放入主栈后,我们需要从临时栈中再把元素pop出压入主栈,
注:主要就是在插入元素的过程中,主栈的元素都是比val大,临时栈都比val小。
Java代码
import java.util.*;
//思想,在插入的时候就循环检测主栈元素栈顶,要求主栈元素均大于val,辅助栈均小于val.
class SortedStack {
//初始栈
Deque<Integer> stack;
//临时栈
Deque<Integer> tempStack;
public SortedStack() {
stack = new LinkedList<Integer>();
tempStack = new LinkedList<Integer>();
}
public void push(int val) {
if(stack.isEmpty()){
stack.push(val);
}else{
//这里必须是循环多次移动比较栈顶元素的情况
while(!stack.isEmpty() && val> stack.peek()){
tempStack.push(stack.pop()); //把这个主栈栈顶元素拿出放入临时栈;再继续比较主栈新的栈顶和val
}
//退出上述while就找到了val可以放入到主栈的位置
stack.push(val);
//此时把临时栈中的元素都拿回来。
while(!tempStack.isEmpty()){
stack.push(tempStack.pop());
}
}
}
public void pop() {
if(stack.isEmpty()){
return;
}
//直接pop
stack.pop();
}
public int peek() {
if(stack.isEmpty()){
return -1;
}else{
return stack.peek();
}
}
public boolean isEmpty() {
return stack.isEmpty();
}
}
/**
* Your SortedStack object will be instantiated and called as such:
* SortedStack obj = new SortedStack();
* obj.push(val);
* obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.isEmpty();
*/
时间复杂度
最坏O(n)