1. 程式人生 > >【死磕演算法·棧和佇列】雙棧排序問題

【死磕演算法·棧和佇列】雙棧排序問題

題目要求:一個棧中元素型別為整型,現在想將該棧自頂到底從大到小排序(vector中第一個元素為棧頂),只能申請一個棧,除此之外可以申請新的變數,但不能申請額外的資料結構,如何完成排序?

思路:記原來的棧為stack,申請的輔助棧為help,設定help自頂到底從小到大排序,即可將help倒入stack中,實現stack自頂到底從大到小排序。

從stack中彈出棧頂元素,記為current。

如果current小於等於help的棧頂元素,將current壓入help中;

如果current大於help的棧頂元素,將help中的元素逐一彈出壓到stack中,直到current小於等於help的棧頂元素。

直到stack中的元素全部轉移到了help中,將help的棧元素逐一壓回stack中即可。

此題用vector實現stack,vector的第一個元素為棧頂,則在待返回的vector中vector[0]為最大值,則申請的輔助vector中應該是vector[0]是最小值.

因此在help 向量中 vector[0]...vector[length-1] 從小到大排序;

numbers向量中numbers[0]...numbers[lenght-1]從大到小排序。

class TwoStacks {
public://用vector模擬棧操作
    vector<int> twoStacksSort(vector<int> numbers) {
        // write code here
        vector<int> help;
        while(!numbers.empty()){
             int current = numbers.back();
             numbers.pop_back();
             if(help.empty())
                 help.push_back(current);
             else{
                 if(current>=help.back())
                     help.push_back(current);
                 else{
                     while(!help.empty()&& current<help.back()){
                         numbers.push_back(help.back());
                         help.pop_back();
                     }
                     help.push_back(current);
                 }
                 
                 
              }
        }
        while(!help.empty()){
             numbers.push_back(help.back());
             help.pop_back();
        }
        return numbers;
            }
};