注:转自栈的面试题—对栈进行升序排列
题目描述
请编写一个程序,按升序对栈进行排序,要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。 vector数组numbers中的第一个元素就是栈顶元素,升序排列,即栈顶元素最大
解题思路
看到这个题,因为可以申请一个栈用来存放临时数据,所以我们可以这样想: 由于栈先进后出的特性,先将原来栈中的数据存放到临时数据栈中,并且保证临时栈中的数据是降序排列的,这一过程完成之后,再将临时数据栈中的元素依次push到返回栈中即可。
具体实现步骤:
(1)申请一个数据栈s用来存放numbers中的数据,再申请一个临时栈tmp用来存放临时数据 (2)比较s栈弹出的栈顶元素top与tmp的栈顶元素,并进行相应的操作,以确保tmp栈中的数据是降序的,具体比较过程如下: 当s栈不为空时:
条件具体操作
若tmp栈为空或者top<=tmp.top()就将top元素push到tmp栈中若tmp栈不为空并且top>tmp.top()将tmp中比top小的元素都push到s栈中,最后再将top元素push到tmp栈中
(3)此时tmp栈中的栈顶元素为最小值,将tmp栈中的元素依次弹出到s栈中,再将s栈中的元素依次弹出并保存到一个vector数组中。
操作演示图:
代码实现
class TwoStacks {
public:
vector
<int> twoStacksSort(vector
<int> numbers
) {
int size
=numbers
.size();
stack
<int>s
;
stack
<int>tmp
;
vector
<int> res
;
for(int i
=size
-1;i
>=0;i
--)
s
.push(numbers
[i
]);
while(!s
.empty())
{
int top
=s
.top();
s
.pop();
if(tmp
.empty()||top
<=tmp
.top())
tmp
.push(top
);
else{
while(!tmp
.empty()&&top
>tmp
.top())
{
s
.push(tmp
.top());
tmp
.pop();
}
tmp
.push(top
);
}
}
while(!tmp
.empty())
{
s
.push(tmp
.top());
tmp
.pop();
}
while(!s
.empty())
{
res
.push_back(s
.top());
s
.pop();
}
return res
;
}
};