堆栈

目录:

9、【剑指Offer学习】【面试题09:用两个栈实现队列】

30、【剑指Offer学习】【面试题30:包含min函数的栈】

31、【剑指Offer学习】【面试题31:栈的压入、弹出序列】

9. 【剑指Offer学习】【面试题09:用两个栈实现队列】

    /*******************************************************************
    Copyright(c) 2016, Harry He
    All rights reserved.

    Distributed under the BSD license.
    (See accompanying file LICENSE.txt at
    https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
    *******************************************************************/

    //==================================================================
    // 《剑指Offer——名企面试官精讲典型编程题》代码
    // 作者:何海涛
    //==================================================================

    // 面试题9:用两个栈实现队列
    // 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail
    // 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。

    #include "Queue.h"

    // ====================测试代码====================
    void Test(char actual, char expected)
    {
        if(actual == expected)
            printf("Test passed.\n");
        else
            printf("Test failed.\n");
    }

    int main(int argc, char* argv[])
    {
        CQueue<char> queue;

        queue.appendTail('a');
        queue.appendTail('b');
        queue.appendTail('c');

        char head = queue.deleteHead();
        Test(head, 'a');

        head = queue.deleteHead();
        Test(head, 'b');

        queue.appendTail('d');
        head = queue.deleteHead();
        Test(head, 'c');

        queue.appendTail('e');
        head = queue.deleteHead();
        Test(head, 'd');

        head = queue.deleteHead();
        Test(head, 'e');

        return 0;
    }
</char>
    /*******************************************************************
    Copyright(c) 2016, Harry He
    All rights reserved.

    Distributed under the BSD license.
    (See accompanying file LICENSE.txt at
    https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
    *******************************************************************/

    //==================================================================
    // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
    // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
    //==================================================================

    // &#x9762;&#x8BD5;&#x9898;9&#xFF1A;&#x7528;&#x4E24;&#x4E2A;&#x6808;&#x5B9E;&#x73B0;&#x961F;&#x5217;
    // &#x9898;&#x76EE;&#xFF1A;&#x7528;&#x4E24;&#x4E2A;&#x6808;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x961F;&#x5217;&#x3002;&#x961F;&#x5217;&#x7684;&#x58F0;&#x660E;&#x5982;&#x4E0B;&#xFF0C;&#x8BF7;&#x5B9E;&#x73B0;&#x5B83;&#x7684;&#x4E24;&#x4E2A;&#x51FD;&#x6570;appendTail
    // &#x548C;deleteHead&#xFF0C;&#x5206;&#x522B;&#x5B8C;&#x6210;&#x5728;&#x961F;&#x5217;&#x5C3E;&#x90E8;&#x63D2;&#x5165;&#x7ED3;&#x70B9;&#x548C;&#x5728;&#x961F;&#x5217;&#x5934;&#x90E8;&#x5220;&#x9664;&#x7ED3;&#x70B9;&#x7684;&#x529F;&#x80FD;&#x3002;

    #pragma once
    #include <stack>
    #include <exception>

    using namespace std;

    template <typename t> class CQueue
    {
    public:
        CQueue(void);
        ~CQueue(void);

        // &#x5728;&#x961F;&#x5217;&#x672B;&#x5C3E;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x7ED3;&#x70B9;
        void appendTail(const T& node);

        // &#x5220;&#x9664;&#x961F;&#x5217;&#x7684;&#x5934;&#x7ED3;&#x70B9;
        T deleteHead();

    private:
        stack<t> stack1;
        stack<t> stack2;
    };

    template <typename t> CQueue<t>::CQueue(void)
    {
    }

    template <typename t> CQueue<t>::~CQueue(void)
    {
    }

    template<typename t> void CQueue<t>::appendTail(const T& element)
    {
        stack1.push(element);
    }

    template<typename t> T CQueue<t>::deleteHead()
    {
        if(stack2.size()<= 0) { while(stack1.size()>0)
            {
                T& data = stack1.top();
                stack1.pop();
                stack2.push(data);
            }
        }

        if(stack2.size() == 0)
            throw new exception("queue is empty");

        T head = stack2.top();
        stack2.pop();

        return head;
    }
</=></t></typename></t></typename></t></typename></t></typename></t></t></typename></exception></stack>

30. 面试题30:包含min函数的栈

    //==================================================================
    // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
    // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
    //==================================================================

    // &#x9762;&#x8BD5;&#x9898;30&#xFF1A;&#x5305;&#x542B;min&#x51FD;&#x6570;&#x7684;&#x6808;
    // &#x9898;&#x76EE;&#xFF1A;&#x5B9A;&#x4E49;&#x6808;&#x7684;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF0C;&#x8BF7;&#x5728;&#x8BE5;&#x7C7B;&#x578B;&#x4E2D;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A;&#x80FD;&#x591F;&#x5F97;&#x5230;&#x6808;&#x7684;&#x6700;&#x5C0F;&#x5143;&#x7D20;&#x7684;min
    // &#x51FD;&#x6570;&#x3002;&#x5728;&#x8BE5;&#x6808;&#x4E2D;&#xFF0C;&#x8C03;&#x7528;min&#x3001;push&#x53CA;pop&#x7684;&#x65F6;&#x95F4;&#x590D;&#x6742;&#x5EA6;&#x90FD;&#x662F;O(1)&#x3002;

    #pragma once

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

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

        T& top();
        const T& top() const;

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

        const T& min() const;

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

    private:
        std::stack<t>   m_data;     // &#x6570;&#x636E;&#x6808;&#xFF0C;&#x5B58;&#x653E;&#x6808;&#x7684;&#x6240;&#x6709;&#x5143;&#x7D20;
        std::stack<t>   m_min;      // &#x8F85;&#x52A9;&#x6808;&#xFF0C;&#x5B58;&#x653E;&#x6808;&#x7684;&#x6700;&#x5C0F;&#x5143;&#x7D20;
    };

    template <typename t> void StackWithMin<t>::push(const T& value)
    {
        // &#x628A;&#x65B0;&#x5143;&#x7D20;&#x6DFB;&#x52A0;&#x5230;&#x8F85;&#x52A9;&#x6808;
        m_data.push(value);

        // &#x5F53;&#x65B0;&#x5143;&#x7D20;&#x6BD4;&#x4E4B;&#x524D;&#x7684;&#x6700;&#x5C0F;&#x5143;&#x7D20;&#x5C0F;&#x65F6;&#xFF0C;&#x628A;&#x65B0;&#x5143;&#x7D20;&#x63D2;&#x5165;&#x8F85;&#x52A9;&#x6808;&#x91CC;&#xFF1B;
        // &#x5426;&#x5219;&#x628A;&#x4E4B;&#x524D;&#x7684;&#x6700;&#x5C0F;&#x5143;&#x7D20;&#x91CD;&#x590D;&#x63D2;&#x5165;&#x8F85;&#x52A9;&#x6808;&#x91CC;
        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();
    }
</t></typename></t></typename></t></typename></t></typename></t></typename></t></typename></t></typename></t></t></typename></assert.h></stack>

31. 面试题31:栈的压入、弹出序列

        /*******************************************************************
        Copyright(c) 2016, Harry He
        All rights reserved.

        Distributed under the BSD license.
        (See accompanying file LICENSE.txt at
        https://github.com/zhedahht/CodingInterviewChinese2/blob/master/LICENSE.txt)
        *******************************************************************/

        //==================================================================
        // &#x300A;&#x5251;&#x6307;Offer&#x2014;&#x2014;&#x540D;&#x4F01;&#x9762;&#x8BD5;&#x5B98;&#x7CBE;&#x8BB2;&#x5178;&#x578B;&#x7F16;&#x7A0B;&#x9898;&#x300B;&#x4EE3;&#x7801;
        // &#x4F5C;&#x8005;&#xFF1A;&#x4F55;&#x6D77;&#x6D9B;
        //==================================================================

        // &#x9762;&#x8BD5;&#x9898;31&#xFF1A;&#x6808;&#x7684;&#x538B;&#x5165;&#x3001;&#x5F39;&#x51FA;&#x5E8F;&#x5217;
        // &#x9898;&#x76EE;&#xFF1A;&#x8F93;&#x5165;&#x4E24;&#x4E2A;&#x6574;&#x6570;&#x5E8F;&#x5217;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x5E8F;&#x5217;&#x8868;&#x793A;&#x6808;&#x7684;&#x538B;&#x5165;&#x987A;&#x5E8F;&#xFF0C;&#x8BF7;&#x5224;&#x65AD;&#x7B2C;&#x4E8C;&#x4E2A;&#x5E8F;&#x5217;&#x662F;
        // &#x5426;&#x4E3A;&#x8BE5;&#x6808;&#x7684;&#x5F39;&#x51FA;&#x987A;&#x5E8F;&#x3002;&#x5047;&#x8BBE;&#x538B;&#x5165;&#x6808;&#x7684;&#x6240;&#x6709;&#x6570;&#x5B57;&#x5747;&#x4E0D;&#x76F8;&#x7B49;&#x3002;&#x4F8B;&#x5982;&#x5E8F;&#x5217;1&#x3001;2&#x3001;3&#x3001;4&#x3001;
        // 5&#x662F;&#x67D0;&#x6808;&#x7684;&#x538B;&#x6808;&#x5E8F;&#x5217;&#xFF0C;&#x5E8F;&#x5217;4&#x3001;5&#x3001;3&#x3001;2&#x3001;1&#x662F;&#x8BE5;&#x538B;&#x6808;&#x5E8F;&#x5217;&#x5BF9;&#x5E94;&#x7684;&#x4E00;&#x4E2A;&#x5F39;&#x51FA;&#x5E8F;&#x5217;&#xFF0C;&#x4F46;
        // 4&#x3001;3&#x3001;5&#x3001;1&#x3001;2&#x5C31;&#x4E0D;&#x53EF;&#x80FD;&#x662F;&#x8BE5;&#x538B;&#x6808;&#x5E8F;&#x5217;&#x7684;&#x5F39;&#x51FA;&#x5E8F;&#x5217;&#x3002;

        #include <cstdio>
        #include <stack>

        bool IsPopOrder(const int* pPush, const int* pPop, int nLength)
        {
            bool bPossible = false;

            if(pPush != nullptr && pPop != nullptr && nLength > 0)
            {
                const int* pNextPush = pPush;
                const int* pNextPop = pPop;

                std::stack<int> stackData;

                while(pNextPop - pPop < nLength)
                {
                    // &#x5F53;&#x8F85;&#x52A9;&#x6808;&#x7684;&#x6808;&#x9876;&#x5143;&#x7D20;&#x4E0D;&#x662F;&#x8981;&#x5F39;&#x51FA;&#x7684;&#x5143;&#x7D20;
                    // &#x5148;&#x538B;&#x5165;&#x4E00;&#x4E9B;&#x6570;&#x5B57;&#x5165;&#x6808;
                    while(stackData.empty() || stackData.top() != *pNextPop)
                    {
                        // &#x5982;&#x679C;&#x6240;&#x6709;&#x6570;&#x5B57;&#x90FD;&#x538B;&#x5165;&#x8F85;&#x52A9;&#x6808;&#x4E86;&#xFF0C;&#x9000;&#x51FA;&#x5FAA;&#x73AF;
                        if(pNextPush - pPush == nLength)
                            break;

                        stackData.push(*pNextPush);

                        pNextPush ++;
                    }

                    if(stackData.top() != *pNextPop)
                        break;

                    stackData.pop();
                    pNextPop ++;
                }

                if(stackData.empty() && pNextPop - pPop == nLength)
                    bPossible = true;
            }

            return bPossible;
        }

        // ====================&#x6D4B;&#x8BD5;&#x4EE3;&#x7801;====================
        void Test(const char* testName, const int* pPush, const int* pPop, int nLength, bool expected)
        {
            if(testName != nullptr)
                printf("%s begins: ", testName);

            if(IsPopOrder(pPush, pPop, nLength) == expected)
                printf("Passed.\n");
            else
                printf("failed.\n");
        }

        void Test1()
        {
            const int nLength = 5;
            int push[nLength] = {1, 2, 3, 4, 5};
            int pop[nLength] = {4, 5, 3, 2, 1};

            Test("Test1", push, pop, nLength, true);
        }

        void Test2()
        {
            const int nLength = 5;
            int push[nLength] = {1, 2, 3, 4, 5};
            int pop[nLength] = {3, 5, 4, 2, 1};

            Test("Test2", push, pop, nLength, true);
        }

        void Test3()
        {
            const int nLength = 5;
            int push[nLength] = {1, 2, 3, 4, 5};
            int pop[nLength] = {4, 3, 5, 1, 2};

            Test("Test3", push, pop, nLength, false);
        }

        void Test4()
        {
            const int nLength = 5;
            int push[nLength] = {1, 2, 3, 4, 5};
            int pop[nLength] = {3, 5, 4, 1, 2};

            Test("Test4", push, pop, nLength, false);
        }

        // push&#x548C;pop&#x5E8F;&#x5217;&#x53EA;&#x6709;&#x4E00;&#x4E2A;&#x6570;&#x5B57;
        void Test5()
        {
            const int nLength = 1;
            int push[nLength] = {1};
            int pop[nLength] = {2};

            Test("Test5", push, pop, nLength, false);
        }

        void Test6()
        {
            const int nLength = 1;
            int push[nLength] = {1};
            int pop[nLength] = {1};

            Test("Test6", push, pop, nLength, true);
        }

        void Test7()
        {
            Test("Test7", nullptr, nullptr, 0, false);
        }

        int main(int argc, char* argv[])
        {
            Test1();
            Test2();
            Test3();
            Test4();
            Test5();
            Test6();
            Test7();

            return 0;
        }
</int></stack></cstdio>

Original: https://www.cnblogs.com/agui125/p/12024962.html
Author: 风御之举
Title: 堆栈

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607219/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 微服务架构项目浅析

    微服务架构的演变 最初的需求 业务发展后需要克服的问题 微服务架构使用的组件 Nginx Redis Rabbitmq Mysql jar jdk * 总结 ​ 这个章节主要介绍微…

    Linux 2023年6月14日
    0119
  • Kasini3000 batch modify the password for windows node

    https://gitee.com/chuanjiao10/kasini3000 win,linux devops automation batch script framewor…

    Linux 2023年6月13日
    0106
  • 001 研发同学必学哪些 Linux 命令?

    身为研发同学,Linux 是绕不过去的一个小山包,不是说要掌握的十分精通,在程序员界里做个极客,也不是说要抢了 Devops 同学的饭碗,但至少要做到摆脱对 Linux 命令认知的…

    Linux 2023年5月27日
    091
  • 零成本搭建个人博客搭建篇

    为什么要搭建个人博客 尽管已经有很多成型的在线博客平台供大家使用(csdn,博客园,掘金等),但是它们都有一些很明显的弊端,例如账号以及博客内容受到监管,所有权不属于作者本人,对于…

    Linux 2023年6月7日
    069
  • 【C++基础】数据类型

    C++规定在创建一个变量或者产量时,必须要指定相应的数据类型,否则无法给变量分配内存空间 数据类型的存在意义:给变量分配合适的内存空间 整型 作用:整型变量表示的是整数类型的数据 …

    Linux 2023年6月13日
    0101
  • 如何入行软件开发——常见问题及岗位分工

    —— 你以为我每天上班就是为了几个臭钱么!? —— 是的,你说对了…… IT是一个有些让业外同行羡慕嫉妒恨的行业,统计数据来说平均薪资应当是仅次于金融行业的…

    Linux 2023年6月13日
    096
  • apk自签证书

    需要用到keytool.exe (位于D:\Program Files\Java\jdk1.8.0_291\jre\bin目录下),使用产生的key对apk签名用到的是jarsig…

    Linux 2023年6月8日
    0105
  • linux系统引导过程

    linux系统引导过程 linux-0.11引导时,将依次运行BIOS程序、bootsect.s、setup.s和head.s,完成引导过程后进入到main函数运行。BIOS完成硬…

    Linux 2023年6月13日
    072
  • 编写radware的负载配置

    radware如何添加负载服务? 笔者在新添加radware的新负载服务的时候,是习惯去看下上一个负载服务的ID 和 节点服务的ID 号 分别是多少,主要是避免ID冲突,把其他服务…

    Linux 2023年6月8日
    0105
  • FinalShell—一体化服务器管理软件(SSH客户端)

    下面附上一些截图和官方连接: 官网:http://www.hostbuf.com/ FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运…

    Linux 2023年5月28日
    086
  • redis中setbit的用法

    原文地址:http://www.zhihu.com/question/27672245 在redis中,存储的字符串都是以二级制的进行存在的。举例:设置一个 key-value ,…

    Linux 2023年5月28日
    096
  • 【已解决】wordpress 修改固定链接 伪静态URL出现nginx 404错误

    一、站点设置 打开站点设置,选择伪静态,选择wordpress 二、wordpress设置 打开wordpress后台,选择 设置 —》固定链接 选择一个你喜欢的格式点…

    Linux 2023年6月14日
    0110
  • RAID级别

    常用选项 模式: 创建:-C 装配:-A 监控:-F 管理:-f, -r, -a < raiddevice> : /dev/md# < component-dev…

    Linux 2023年6月6日
    092
  • gitlab部署

    Gitlab部署 Gitlab部署 Gitlab的基本使用 新建项目 使用命令行的方式管理项目 上传文件 新建分支 拉取文件 //配置yum源 [root@localhost ~]…

    Linux 2023年6月13日
    0113
  • 五、用户管理

    id root查看用户uiduid 0管理员uid 1-999系统账号uid 1000-60000普通账号gid 0 管理组gid 1-999 系统组gid 1000-60000 …

    Linux 2023年6月7日
    083
  • SQL55 分页查询employees表,每5行一页,返回第2页的数据

    LIMIT子句 本题链接表结构如下所示。 +——–+————+——&#8…

    Linux 2023年6月13日
    092
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球