問題描述:?
棧排序。 編寫程序,對棧進行排序使最小元素位于棧頂。最多只能使用一個其他的臨時棧存放數據,但不得將元素復制到別的數據結構(如數組)中。該棧支持如下操作:push
、pop
、peek
?和?isEmpty
。當棧為空時,peek
?返回 -1。
示例1:
輸入: ["SortedStack", "push", "push", "peek", "pop", "peek"] [[], [1], [2], [], [], []] 輸出: [null,null,null,1,null,2]
示例2:
輸入: ["SortedStack", "pop", "pop", "push", "pop", "isEmpty"] [[], [], [], [1], [], []] 輸出: [null,null,null,null,null,true]
說明:
- 棧中的元素數目在[0, 5000]范圍內。
解決方案:
1、分析題目:用兩個棧(主棧+輔助棧)實現排序算法,返回主棧
2、棧頂元素比較:主棧 始終為較大的值,輔助棧 始終為小值
注:輔助棧中始終為降序出棧(先大后小)
3、循環判斷:如果 主棧 中棧頂元素?< 待輸入值(val),該元素歸入 輔助棧里。
例:1,3,2
(1)1--> 主棧
(2)1<3:1-->輔助棧,3-->主棧,1-->主棧?
(3)1<2:同上,結果:主棧(3)輔助棧(1)
? ? ? ? ? ? ? ? ? ?第二次判斷:3>2 :2 直接放入 主棧,合并輔助棧,即主棧(1,2,3)
函數代碼:
class SortedStack { public:stack<int> num;stack<int> tmp;SortedStack() {}void push(int val) {while(!num.empty() && num.top()<val){tmp.push(num.top());num.pop();}num.push(val);while(!tmp.empty()){num.push(tmp.top());tmp.pop();}}void pop() {if(!num.empty()) num.pop();}int peek() {if(num.empty()) return -1;return num.top();}bool isEmpty() {return num.empty();} };