題目:定義棧的數據結構,要求添加一個min函數,可以獲得棧的最小元素。
要求函數min、push以及pop的時間複雜度都是O(1)。ios
思路:使用一個輔助棧來保存最小元素,這個解法簡單不失優雅。設該輔助棧名字爲minimum stack,其棧頂元素爲當前棧中的最小元素。數據結構
要獲取當前棧中最小元素,只須要返回minimum stack的棧頂元素便可。函數
每次執行push操做,檢查push的元素是否小於或等於minimum stack棧頂元素。若是是,則也push該元素到minimum stack中。spa
當執行pop操做的時候,檢查pop的元素是否與當前最小值相等。若是相同,則須要將改元素從minimum stack中pop出去。code
#include<stdio.h> #include <iostream> #include <stack> using namespace std ; struct StackGetMin { stack<int> elements; stack<int> minStack; void push(int x) { elements.push(x); if (minStack.empty() || x <= minStack.top()) //push的元素小於當前minStack的最小元素,則push到minStack中 minStack.push(x); } bool pop() { if (elements.empty()) return false; if (elements.top() == minStack.top()) //若是原始棧棧頂元素與minStack棧頂元素相同,則將該元素也從minStack中pop出去。 minStack.pop(); elements.pop(); return true; } bool getMin(int &min) { if (minStack.empty()) { return false; } else { min = minStack.top(); return true; } } }; int main() { StackGetMin stackMin; stackMin.push(2); stackMin.push(6); stackMin.push(4); stackMin.push(1); stackMin.push(5); int min =0; stackMin.getMin(min ); cout<<min; getchar(); return 0; }