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

运行截图:

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

 

你可能感兴趣的:(面试题)