請編寫一個程式,按升序對棧進行排序(即最大元素位于棧頂),要求最多隻能使用一個額外的棧存放臨時資料,但不得将元素複制到别的資料結構中。
給定一個int[] numbers(C++中為vector),其中第一個元素為棧頂,請傳回排序後的棧。請注意這是一個棧,意味着排序過程中你隻能通路到第一個元素。
測試樣例:
[1,2,3,4,5]
傳回:[5,4,3,2,1]
思路非常簡單,利用一個輔助棧,每次比較排序棧和輔助棧的頂元素,如果排序棧較小直接壓入輔助棧,并彈出排序棧,否則将輔助棧的元素彈出并壓在排序棧棧頂元素的後面。知道排序棧沒有元素了,之後将輔助棧的元素全部導入排序棧,就完成排序。
class TwoStacks {
public:
vector<int> twoStacksSort(vector<int> numbers) {
stack<int> mystack,help;
for(auto i=numbers.end()-;i>=numbers.begin();--i)
mystack.push(*i);
while(!mystack.empty())
{
if(help.empty()){
help.push(mystack.top());
mystack.pop();
}
else if(mystack.top()<=help.top())
{
help.push(mystack.top());
mystack.pop();
}
else
{
int temp=mystack.top();
mystack.pop();
mystack.push(help.top());
mystack.push(temp);
help.pop();
}
}
while(!help.empty())
{
mystack.push(help.top());
help.pop();
}
for(auto &c:numbers)
{
c=mystack.top();
mystack.pop();
}
return numbers;
}
};