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

 

posted @ 2019-08-07 14:34  琴影  阅读(166)  评论(0编辑  收藏  举报