天天看點

雙棧排序練習

請編寫一個程式,按升序對棧進行排序(即最大元素位于棧頂),要求最多隻能使用一個額外的棧存放臨時資料,但不得将元素複制到别的資料結構中。

給定一個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;
    }
};