题目描述
请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。
给定一个int[] numbers(C++中为vector<int>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。
测试样例:
[1,2,3,4,5]
返回:[5,4,3,2,1]----------------------------------------------------------------------------------
理解:给出的numbers 只是为了提供数据,题目的本意应该是自己使用两个栈来把给出的数据进行排序,最后利用numbers看结果
-----1:将数据按题意入栈ori;
-----2:如果ori不空循环执行:ori栈顶元素出栈,若res栈为空或者ori->top不小于res->top,直接进栈res;
否则,暂存ori->top; res栈顶元素出栈并进栈ori;直到res为空或者res->top为更小值,栈存值入栈res。
代码实现:
class TwoStacks {
public:
vector<int> twoStacksSort(vector<int> numbers) {
if (numbers.size()<=1)
return numbers;
// 双栈排序
stack<int> ori;
stack<int> res;
decltype(numbers.size()) i = numbers.size();
while (i){
ori.push(numbers[i-1]);//依题意将numbers[0]放栈顶
--i;
}
while (!ori.empty()){
if (res.empty() || ori.top() >= res.top()){
res.push(ori.top());
ori.pop();
}else {
numbers[0] = ori.top();//暂存小元
ori.pop();
while(!res.empty() && numbers[0] < res.top()){
ori.push(res.top());
res.pop();
}
res.push(numbers[0]);
}
}
//将排好的元素送到numbers;
i=0;
while (!res.empty()){
numbers[i++] = res.top();
res.pop();
}
return numbers;
}
};