• 【面试题021】包含min函数的栈


    【面试题021】包含min函数的栈 

    MinStack.cpp:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    #include <iostream>
    #include "StackWithMin.h"
    #include <cstdio>

    using namespace std;

    void Test(char *testName, const StackWithMin<int> &stack, int expected)
    {
        if(testName != NULL)
            printf("%s begins: ", testName);

        if(stack.min() == expected)
            printf("Passed. ");
        else
            printf("Failed. ");
    }

    int main()
    {
        StackWithMin<int> stack;

        stack.push(3);
        Test("Test1", stack, 3);

        stack.push(4);
        Test("Test2", stack, 3);

        stack.push(2);
        Test("Test3", stack, 2);

        stack.push(3);
        Test("Test4", stack, 2);

        stack.pop();
        Test("Test5", stack, 2);

        stack.pop();
        Test("Test6", stack, 3);

        stack.pop();
        Test("Test7", stack, 3);

        stack.push(0);
        Test("Test8", stack, 0);

        return 0;
    }
     
    运行结果:
    Test1 begins: Passed.
    Test2 begins: Passed.
    Test3 begins: Passed.
    Test4 begins: Passed.
    Test5 begins: Passed.
    Test6 begins: Passed.
    Test7 begins: Passed.
    Test8 begins: Passed.
     

    StackWithMin.cpp:

    1
     
    #include "StackWithMin.h"



    StackWithMin.h:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    #ifndef _STACK_WITH_MIN_H_
    #define _STACK_WITH_MIN_H_

    #include <stack>
    #include <assert.h>
    #include <stddef.h>

    template <typename T> class StackWithMin
    {
    public:
        StackWithMin(void) {}
        virtual ~StackWithMin(void) {}

        T &top(void);
        const T &top(voidconst;

        void push(const T &value);
        void pop(void);

        const T &min(voidconst;

        bool empty() const;
        size_t size() const;

    private:
        std::stack<T>   m_data;     // 数据栈,存放栈的所有元素
        std::stack<T>   m_min;      // 辅助栈,存放栈的最小元素
    };

    template <typename T> void StackWithMin<T>::push(const T &value)
    {
        // 把新元素添加到辅助栈
        m_data.push(value);

        // 当新元素比之前的最小元素小时,把新元素插入辅助栈里;
        // 否则把之前的最小元素重复插入辅助栈里
        if(m_min.size() == 0 || value < m_min.top())
            m_min.push(value);
        else
            m_min.push(m_min.top());
    }

    template <typename T> void StackWithMin<T>::pop()
    {
        assert(m_data.size() > 0 && m_min.size() > 0);

        m_data.pop();
        m_min.pop();
    }


    template <typename T> const T &StackWithMin<T>::min() const
    {
        assert(m_data.size() > 0 && m_min.size() > 0);

        return m_min.top();
    }

    template <typename T> T &StackWithMin<T>::top()
    {
        return m_data.top();
    }

    template <typename T> const T &StackWithMin<T>::top() const
    {
        return m_data.top();
    }

    template <typename T> bool StackWithMin<T>::empty() const
    {
        return m_data.empty();
    }

    template <typename T> size_t StackWithMin<T>::size() const
    {
        return m_data.size();
    }


    #endif /*_STACK_WITH_MIN_H_*/



    Makefile:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    .PHONY:clean  
    CPP=g++  
    CFLAGS=-Wall -g  
    BIN=test  
    OBJS=MinStack.o StackWithMin.o  
    LIBS=  
    $(BIN):$(OBJS)  
        $(CPP) $(CFLAGS) $^ -o $@ $(LIBS)  
    %.o:%.cpp  
        $(CPP) $(CFLAGS) -c $< -o $@  
    clean:  
        rm -f *.o $(BIN)  
     
     
  • 相关阅读:
    Jmeter监控服务器性能
    三种主流的WebService实现方案(REST/SOAP/XML-RPC)简述及比较
    从0到1搭建移动App功能自动化测试平台(0):背景介绍和平台规划
    Jmeter监控系统等资源,ServerAgent端口的修改
    Performance plugin离线安装
    Oracle定义常量和变量
    通过FTP将一个数据文件从A服务器下载到B服务器的整个过程
    Oracle使用%rowtype变量存储一行数据
    Oracle使用%type类型的变量输出结果
    mdf与ldf文件如何还原到SQLserver数据库
  • 原文地址:https://www.cnblogs.com/codemylife/p/3720209.html
Copyright © 2020-2023  润新知