【死磕演算法·棧和佇列】雙棧排序問題
阿新 • • 發佈:2018-12-22
題目要求:一個棧中元素型別為整型,現在想將該棧自頂到底從大到小排序(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; } };