zoukankan      html  css  js  c++  java
  • 剑指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 }

    运行截图:

  • 相关阅读:
    [转]OC与JS的交互详解
    [iOS]数据库第三方框架FMDB详细讲解
    iOS开发-NSOperation与GCD区别
    iOS开发:深入理解GCD 第一篇
    iOS开发之集成ijkplayer视频直播
    iOS--KVO的实现原理与具体应用
    JAVA中Colllection的基本功能
    JAVA中的数组对象
    结对编程《四则运算》
    关于结对编程
  • 原文地址:https://www.cnblogs.com/vpoet/p/4675935.html
Copyright © 2011-2022 走看看