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

题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的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 }

运行截图:

原文地址:https://www.cnblogs.com/vpoet/p/4675935.html