面试金典--min栈的实现
生活随笔
收集整理的這篇文章主要介紹了
面试金典--min栈的实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述:實(shí)現(xiàn)一個(gè)包含min操作的棧,時(shí)間復(fù)雜度需要是O(1)
思路:一開始的想法是添加輔助棧保存當(dāng)前最小元素,但是這樣存在的問題就是不能處理重復(fù)元素;于是.....我還是google了,找到如下錦囊妙計(jì)
不需要額外的空間,棧頂保存的是最小元素,每次push比較,如果當(dāng)前元素更小的話就更新棧頂,另外棧頂以下元素保存的是元素push的時(shí)候與
當(dāng)時(shí)的最小值的差值;pop的時(shí)候,就是看棧頂元素后的下一個(gè)元素,如果小于零,說明當(dāng)前需要pop最小元素,同時(shí)更新最小元素,如果大于零,
直接push(最小元素+差值)即可。有點(diǎn)混亂:
看例子:
3 5 2 1
push:
3
2 3
2 -1 2
2 -1 -1 1
pop:
2 -1 2 輸出1
2 3 輸出2
3 輸出5
輸出3
1 #include <iostream> 2 #include <queue> 3 #include <climits> 4 #include <algorithm> 5 #include <memory.h> 6 #include <stdio.h> 7 #include <ostream> 8 #include <vector> 9 #include <list> 10 #include <cmath> 11 #include <string> 12 #include <stdexcept> 13 #include <stack> 14 using namespace std; 15 16 template<typename T> 17 class minStack 18 { 19 public: 20 T pop(); 21 void push(const T& elem); 22 T min(); 23 stack<T> s; 24 }; 25 template<typename T> 26 void minStack<T>::push(const T&elem) 27 { 28 if(s.empty()) 29 { 30 s.push(elem); 31 return; 32 } 33 T minval = s.top(); 34 s.pop(); 35 s.push(elem-minval); 36 if(elem < minval) 37 { 38 s.push(elem); 39 } 40 else 41 s.push(minval); 42 return; 43 } 44 45 template<typename T> 46 T minStack<T>::pop() 47 { 48 if(s.empty()) 49 throw std::out_of_range("stack is empty"); 50 T minval = s.top(); 51 s.pop(); 52 T val = s.top(); 53 s.pop(); 54 if(val <= 0) 55 { 56 s.push(minval - val); 57 val = minval; 58 } 59 else 60 { 61 s.push(minval); 62 val = minval+val; 63 } 64 return val; 65 } 66 67 int main() 68 { 69 return 0; 70 }?
?
轉(zhuǎn)載于:https://www.cnblogs.com/cane/p/3793510.html
總結(jié)
以上是生活随笔為你收集整理的面试金典--min栈的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始编写自己的C#框架(17)——W
- 下一篇: 国内外著名安全站点