剑指offer 包含min函数的栈
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
思路:我们可以用一个变量保存当前栈最小元素,但是当栈顶元素为最小元素,且被弹出时,变量应该保存次小元素,所以只用一个变量是不行的。也就是说,在我们保存最小元素之前,应该把次小元素保存起来。
我们可以用辅助栈保存最小元素,每次新压入一个元素到栈中,比较辅助栈的栈顶元素(当前栈的最小元素),如果新压入的元素不大于栈顶元素(考虑了压入栈的元素值可能重复),则压入辅助栈,作为当前栈的最小元素。
当弹出栈的元素时,如果弹出元素和辅助栈栈顶元素相同,说明应弹出辅助栈顶元素。
步骤 | 操作 | 数据栈 | 辅助栈 | 最小值 |
1 | 压入3 | 3 | 3 | 3 |
2 | 压入4 | 3,4 | 3 | 3 |
3 | 压入2 | 3,4,2 | 3,2 | 2 |
4 | 压入1 | 3,4,2,1 | 3,2,1 | 1 |
5 | 弹出 | 3,4,2 | 3,2 | 2 |
6 | 压入2 | 3,4,2,2 | 3,2,2 | 2 |
7 | 弹出 | 3,4,2 | 3,2 | 2 |
8 | 弹出 | 3,4 | 3 | 3 |
1 class Solution {
2 public:
3 stack<int> st1, st2; //st2作为辅助栈
4 void push(int value) {
5 st1.push(value); //直接压入栈st1中
6 if (st2.empty()) //如果st2为空,直接将当前元素作为最小元素压入st2中
7 st2.push(value);
8 else if (value <= st2.top()) //如果当前新压入的元素不大于辅助栈栈顶元素,则压入辅助栈作为最小元素
9 st2.push(value);
10 }
11 void pop() {
12 if (st1.empty())
13 return;
14 if (st1.top() == st2.top())
15 st2.pop();
16 st1.pop();
17 }
18 int top() {
19 if (!st1.empty())
20 return st1.top();
21 else
22 return -1;
23 }
24 int min() {
25 if (!st2.empty())
26 return st2.top();
27 else
28 return -1;
29 }
30 };
越努力,越幸运