题目:请编写一个程序,按升序对栈进行排序,要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。
思路:首先申请一个栈sta来存放数据栈,再申请一个辅助栈help来存放临时数据,然后比较sta弹出的栈顶的值res与help栈顶元素的大小。
当sta栈不为空时:
1、如果help.empty()或者res<=help.top(),那么就把res的值压入help栈中;
2、如果help不为空并且res>help.top(),那么就把help中栈顶的值弹出并压入sta栈,最后把res的值压入help栈中。
具体可看如下过程图:
示例代码:
#include<iostream>
#include<string>
#include<stack>//pop,top,push
#include<vector>
using namespace std;
class TwoStacks {
public:
vector<int> twoStacksSort(vector<int> numbers)
{
stack<int> sta;
for(vector<int>::reverse_iterator riter=numbers.rbegin();riter!=numbers.rend();riter++)
sta.push(*riter);
StackSort(sta);
vector<int> res;
while(!sta.empty())
{
res.push_back(sta.top());
sta.pop();
}
return res;
}
void StackSort(stack<int> &sta)
{
stack<int> help;
while(!sta.empty())
{
int res=sta.top();
sta.pop();
if(help.empty()||res<=help.top())
help.push(res);
else
{
while(!help.empty()&&res>help.top())
{
sta.push(help.top());
help.pop();
}
help.push(res);
}
}
while(!help.empty())
{
sta.push(help.top());
help.pop();
}
}
};
int main()
{
int a[5]={1,2,3,4,5};
TwoStacks A;
vector<int> arr(a,a+5),res;
res=A.twoStacksSort(arr);
for(vector<int>::iterator iter=res.begin();iter!=res.end();iter++)
cout<<*iter<<" ";
return 0;
}