題目:
棧排序。 編寫程序,對棧進行排序使最小元素位於棧頂。最多只能使用一個其他的臨時棧存放數據,但不得將元素復制到別的數據結構(如數組)中。該棧支持如下操作: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:
堆排序,復雜度n*logn(n次操作,pop_heap最大logn)
class SortedStack { public: vector<int> data; SortedStack() { } void push(int val) { data.push_back(val); make_heap(data.begin(),data.end(),[](const int& a,const int& b){return a>b;}); } void pop() { if(data.empty()){ return; } pop_heap(data.begin(),data.end(),[](const int& a,const int& b){return a>b;}); data.pop_back(); } int peek() { if(data.empty()){ return -1; } return data[0]; } bool isEmpty() { return data.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(); */

注:下面兩個方法代碼不是我寫的
方法2:
每次push都直接排序,復雜度n^2(n,n-1,n-2,n-3...3,2,1這樣倒序push的情況)
class SortedStack { private: stack<int> data; stack<int> help; public: SortedStack() { } void push(int val) { if (!data.empty() && val > data.top()) { while (!data.empty() && val > data.top()) { int temp = data.top(); data.pop(); help.push(temp); } data.push(val); while (!help.empty()) { int temp = help.top(); help.pop(); data.push(temp); } } else { data.push(val); } } void pop() { if (!data.empty()) { data.pop(); } } int peek() { if (!data.empty()) { return data.top(); } else { return -1; } } bool isEmpty() { return data.empty(); } };

方法3:
等到pop再排序,即有連續的push先不排序,先在輔助棧里攢着。如果需要pop了,把輔助棧的數字一股腦push到主棧。再pop。
class SortedStack { private: stack<int>s1;//原棧為升序 stack<int>s2;//輔助棧為降序 public: SortedStack() { } void push(int val) { while(!s2.empty()&&s2.top()>val){//輔助棧中存在比val大的值 s1.push(s2.top()); s2.pop(); } while(!s1.empty()&&s1.top()<val){//原棧中有比val小的值 s2.push(s1.top()); s1.pop(); } s1.push(val); } void pop() { while(!s2.empty()){//清空輔助棧 s1.push(s2.top()); s2.pop(); } if(!s1.empty()) s1.pop(); } int peek() { while(!s2.empty()){//清空輔助棧 s1.push(s2.top()); s2.pop(); } if(!s1.empty()) return s1.top(); else return -1; } bool isEmpty() { return s1.empty()&&s2.empty(); } };

