【LeetCode-棧】棧排序
阿新 • • 發佈:2020-07-13
題目描述
棧排序。 編寫程式,對棧進行排序使最小元素位於棧頂。最多隻能使用一個其他的臨時棧存放資料,但不得將元素複製到別的資料結構(如陣列)中。該棧支援如下操作:push、pop、peek 和 isEmpty。當棧為空時,peek 返回 -1。
示例:
輸入: ["SortedStack", "push", "push", "peek", "pop", "peek"] [[], [1], [2], [], [], []] 輸出: [null,null,null,1,null,2] 輸入: ["SortedStack", "pop", "pop", "push", "pop", "isEmpty"] [[], [], [], [1], [], []] 輸出: [null,null,null,null,null,true]
說明:
- 棧中的元素數目在[0, 5000]範圍內。
題目連結: https://leetcode-cn.com/problems/sort-of-stacks-lcci/
思路
使用兩個棧,一個棧 s 用來儲存資料,另一個棧是輔助棧 help;
入棧:
- 如果 val > s.top(),那麼將 s 的棧頂元素出棧並壓入 help 直到 val 不大於 s.top();
- 將 val 壓入 s.top();
- 將 help 中的元素出棧並壓入 s;
入棧類似於最小棧的做法;
出棧:
- 如果 s 不為空,則 s.pop();
獲取棧頂元素:
- 如果 s 不為空,返回 s.top();
- 否則 返回 -1;
程式碼如下:
class SortedStack { stack<int> s; stack<int> help; public: SortedStack() { } void push(int val) { while(!s.empty() && val>s.top()){ help.push(s.top()); s.pop(); } s.push(val); while(!help.empty()){ s.push(help.top()); help.pop(); } } void pop() { if(!s.empty()) s.pop(); } int peek() { if(!s.empty()) return s.top(); else return -1; } bool isEmpty() { return s.empty(); } }; /** * Your SortedStack object will be instantiated and called as such: * SortedStack* obj = new SortedStack(); * obj->push(val); * obj->pop(); * int param_3 = obj->peek(); * bool param_4 = obj->isEmpty(); */