题面

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中的最小元素的操作。

要求

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 };