题目描述
请编写一个程序,按升序对栈进行排序(即最大元素位于栈顶),要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。
给定一个int[] numbers(C++中为vector<int>),其中第一个元素为栈顶,请返回排序后的栈。请注意这是一个栈,意味着排序过程中你只能访问到第一个元素。
测试样例:
[1,2,3,4,5]
解题思路:一个原栈,一个辅助栈,我们可以将原栈中的元素依次出栈和辅助栈中的栈顶元素进行比较,如果原大于辅,将原出栈到辅助中, 如果辅助大于原,将辅助出栈到原中,直到将原栈中的元素全部出栈,排序完成。
#include<iostream> using namespace std; #include<vector> vector<int> TwoStacksSort(vector<int> numbers) { vector<int> ret; while(!numbers.empty()) { int temp = numbers.back(); //假设vector的最后一个元素就是栈顶。 numbers.pop_back(); while (!ret.empty()&& ret.back() > temp)//当辅助栈中的栈顶元素大于原栈的栈顶元素的时候,将辅助栈的栈顶元素出栈到原栈中。 { numbers.push_back(ret.back()); ret.pop_back(); } ret.push_back(temp); } //排序完成后,ret是升序。 while(!ret.empty()) //将ret中的元素降序。 { numbers.push_back(ret.back()); ret.pop_back(); } return numbers; } int main() { vector<int> number; for(int i = 1; i < 6; ++i) number.push_back(i); number = TwoStacksSort(number); for(int i = 0; i < number.size(); ++i) { cout << number[i] << " "; } cout <<endl; cout << "hello..."<<endl; return 0; }