您的位置:首页 > 职场人生

剑指offer-面试题21.包含min函数的栈

2016-04-07 20:43 597 查看
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。

在该栈中,调用min,push及pop的时间复杂度都是O(1).

 

这一题实际上需要一个辅助栈存储最小值:

1.在模板类定义两个栈类型私有成员变量,一个为保存数据的栈另外一个为保存最小值的栈

2.当栈为空的时候直接将数据同时压入数据栈和最小值栈

3.当栈不为空的时候,将数据先压入数据栈同时比较该数据和最小值栈栈顶元素的大小

  若大于最小值栈栈顶元素,则向最小值栈压入其栈顶元素,否则压入该数据到最小值栈

  栈顶

4.当我们使用方法的时候直接取最小值的栈顶即为栈中的最小值

5.当我们要pop栈的时候应同时pop最小值栈的栈顶元素

 

 

代码实现如下:

MinStack.h

1 #ifndef _MINSTACK_H
2 #define _MINSTACK_H
3
4 #include <stack>
5 using namespace std;
6
7 template <typename T>
8 class StackWithMin
9 {
10 public:
11     void push(T data);
12     void pop();
13     T min();
14 private:
15     stack<T> DataStack;
16     stack<T> MinStack;
17 };
18
19 template <typename T> void StackWithMin<T>::push(T data)
20 {
21     DataStack.push(data);
22     if(MinStack.empty())
23     {
24         MinStack.push(data);
25     }
26     else
27     {
28         if(data>=MinStack.top())
29         {
30             MinStack.push(MinStack.top());
31         }
32         else
33         {
34             MinStack.push(data);
35         }
36     }
37 }
38
39 template <typename T> void StackWithMin<T>::pop()
40 {
41     MinStack.pop();
42     DataStack.pop();
43 }
44
45 template <typename T> T StackWithMin<T>::min()
46 {
47     if(!DataStack.empty())
48     {
49         return MinStack.top();
50     }
51     else
52     {
53         cout<<"不好意思栈空!"<<endl;
54     }
55 }
56
57 #endif


测试函数:

1 #include "MinStack.h"
2 #include <iostream>
3 using namespace std;
4
5 int main()
6 {
7     StackWithMin<int> MinStack;
8     cout<<"请输入依次压入栈的数据(0-exit): "<<endl;
9     int data;
10     while(data!=0)
11     {
12         cin>>data;
13         if(data!=0)
14             MinStack.push(data);
15     }
16     cout<<endl;
17     cout<<"栈的最小值为: "<<MinStack.min()<<endl;;
18
19     return 0;
20 }


运行截图:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: