题面
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中的最小元素的操作。
要求
pop(), push(), getMin()时间复杂度都是O(1)
思路
1.准备两个栈,数据栈+最小元素栈
2.压入元素时,先压入数据栈,然后与最小元素栈顶比较;若小,则压入,若大,不做处理(1)/压入当前栈顶(2)
(1)若不做处理,那么需要在pop()弹出时,做判断,若stackData要弹出的元素与stackMin顶相等,那么将stackMin顶也一并弹出
(2)若2中采用再次压入stackMin顶元素,那么在pop()函数中,就只要弹出两个栈顶即可,逻辑较为简单。
实现 (代码未测试,注意!)
【1】占用额外空间较小,但pop(),push()函数较为复杂
1 class MyStack_1 { 2 private: 3 stack<int> stackData;//数据栈 4 stack<int> stackMin;//最小元素栈 5 public: 6 void push(int num) 7 { 8 stackData.push(num); 9 if (stackMin.empty())//为空,直接压入 10 stackMin.push(num); 11 else 12 { 13 if (num < stackMin.top()) 14 stackMin.push(num); 15 } 16 } 17 int pop() 18 { 19 if (!stackData.empty())//数据栈非空 20 { 21 int top = stackData.top(); 22 stackData.pop(); 23 if (top == stackMin.top()) 24 stackMin.pop(); 25 return top; 26 } 27 } 28 int getMin() 29 { 30 return stackMin.top(); 31 } 32 int top() 33 { 34 return stackData.top(); 35 } 36 };
【2】占用额外空间较大,操作函数简单。
1 class MyStack_2 { 2 private: 3 stack<int> stackData;//数据栈 4 stack<int> stackMin;//最小元素栈 5 public: 6 void push(int num) 7 { 8 stackData.push(num); 9 if (stackMin.empty())//为空,直接压入 10 stackMin.push(num); 11 else 12 { 13 if (num < stackMin.top())//小,压入它 14 stackMin.push(num); 15 else//大,压入当前栈顶 16 stackMin.push(stackMin.top()); 17 } 18 } 19 int pop() 20 { 21 if (!stackData.empty())//数据栈非空 22 { 23 int top = stackData.top(); 24 stackData.pop(); 25 stackMin.pop(); 26 return top; 27 } 28 } 29 int getMin() 30 { 31 return stackMin.top(); 32 } 33 int top() 34 { 35 return stackData.top(); 36 } 37 };