栈排序。 编写程序,对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据,但不得将元素复制到别的数据结构(如数组)中。该栈支持如下操作: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]范围内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-of-stacks-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路1:利用两个栈s1
和s2
,s1
作为主要栈而s2
作为辅助栈,我们保证s1
中的元素都是有序的,将要插入一个元素时,如果s1
的栈顶小于这个元素,那么就把小于这个元素的值都放到s2
中去,然后再倒回来。(单次操作最坏可能要O(n)
)
class SortedStack {
public:
SortedStack() {
}
void push(int val) {
while(!s1.empty() && s1.top() < val)//先把栈种小于当前元素的值放到s2中去
{
s2.push(s1.top());
s1.pop();
}
s1.push(val);
while(!s2.empty())//再把那些值放回来
{
s1.push(s2.top());
s2.pop();
}
}
void pop() {
if(!s1.empty())
s1.pop();
}
int peek() {
if(!s1.empty())
return s1.top();
return -1;
}
bool isEmpty() {
return s1.empty();
}
private:
stack<int> s1;
stack<int> s2;//辅助栈
};
/**
* Your SortedStack object will be instantiated and called as such:
* SortedStack* obj = new SortedStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->peek();
* bool param_4 = obj->isEmpty();
*/
思路2:一个栈升序,一个栈降序。并且辅助栈的元素一定是都小于主栈中的元素。
class SortedStack {
public:
stack<int>s1;//原栈为降序
stack<int>s2;//辅助栈为升序
SortedStack() {
}
void push(int val) {
while(!s2.empty() && s2.top() > val)//辅助栈中的值都比val小
{
s1.push(s2.top());
s2.pop();
}
while(!s1.empty() && s1.top() < val)//原栈中的值都比val大
{
s2.push(s1.top());
s1.pop();
}
s1.push(val);
}
void pop()
{
while(!s2.empty())//将辅助栈里的元素再倒回去
{
s1.push(s2.top());
s2.pop();
}
if(!s1.empty())
s1.pop();
}
int peek() {
while(!s2.empty())//将辅助栈里的元素再倒回去
{
s1.push(s2.top());
s2.pop();
}
if(!s1.empty())
return s1.top();
else
return -1;
}
bool isEmpty()
{
return s1.empty() && s2.empty();
}
};