堆栈

目录:

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)

大家都在看

  • 【考研】C语言

    考研C语言 收录数据结构会用到的C语言知识,建议有基础的情况下再学习,针对性学习即可。 往后的学习要多从内存角度去学习计算机的知识 1. 数组 1.1 一维数值数组 具备相同的数据…

    Linux 2023年6月13日
    099
  • MultipartFile上传文件异步处理时的java.io.FileNotFoundException

    参考:https://javajgs.com/archives/26157 1-1 需求 前端上传Word文档,后端将接收到的Word文档①上传到文件服务器②将Word转为Pdf。…

    Linux 2023年6月8日
    078
  • Markdown 常用语法精讲

    标题 (# 跟标题名称一定要留空格) 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 缩进 (使用) 这是缩进四个空格文本 (源码: 这是缩进四个空格文本) 强调/加粗…

    Linux 2023年6月7日
    0122
  • docker安装zabbix

    Zabbix 为每个组件都提供了 Docker 镜像 ,作为弹性和自给自足的容器,促使加快部署和更新过程。Zabbix 组件支持 MySQL 和 PostgreSQL 数据库、Ap…

    Linux 2023年6月6日
    081
  • B站学习斯坦福大学Swift 语言教程 iOS11 开发【第一集】踩到的几个坑(XCode 13.2.1版本)

    在Xcode 13.2.1 中,找不到从哪里拖拽添加button控件 Xcode13起,添加UI控件需要点击右上方的➕号 button的title属性设置成ghost的emoji后…

    Linux 2023年6月13日
    096
  • 【.Net vs Java? 】 看一看二者的类有多像?

    1. 包(Package)、命名空间(NameSpace) 在Java中常用的是包(Package),较少提到NameSpace的概念。Java官方文档中这样说: 为了使类型更易于…

    Linux 2023年6月7日
    080
  • Linux 配置Git

    前言:请各大网友尊重本人原创知识分享,谨记本人博客: 南国以南i 一、用git –version命令检查是否已经安装 二、下载git源码并解压 wget https:/…

    Linux 2023年5月27日
    0126
  • 解决端口被占用问题

    在 Linux 里查看端口被哪个进程占用(以Apache服务80端口为例,其余的端口一样方法处理) [root@localhost /]# lsof -i:80 #查看进程 COM…

    Linux 2023年6月7日
    0128
  • 内存管理-物理内存虚拟内存布局

    ARM-linux环境,物理内存和虚拟内存之间的映射关系: Original: https://www.cnblogs.com/fanguang/p/11930358.htmlAu…

    Linux 2023年6月6日
    085
  • Question04-查询平均成绩小于60分的同学的学生编号和学生姓名和平均成绩

    * SELECT stu.SID, stu.Sname, IFNULL(CAST(AVG(sc.score) AS DECIMAL(18,2)), 0) 平均成绩 FROM Stu…

    Linux 2023年6月7日
    0118
  • MongoDB建立主从复制小案例(一主一从)

    1. 开启两个mongo服务器(用于一主一从, 没有加安全验证相关参数 : 可以使用mongd-help查看) mongod –bind_ip IP –po…

    Linux 2023年6月6日
    092
  • 计算机网络基础

    计算机网络基础 计算机网络的定义和功能 计算机网络是利用通信设备和线路,将分布在地理位置不同的、功能独立的多个计算机系统连接起来,以功能完善的网络软件(网络通信协议及网络操作系统等…

    Linux 2023年6月7日
    085
  • Linux vim退出命令

    :w – 保存文件,不退出 vim:w file -将修改另外保存到 file 中,不退出 vim:w! -强制保存,不退出 vim:wq -保存文件,退出 vim:w…

    Linux 2023年6月13日
    081
  • CVE-2020-3452漏洞复现

    一、前言 前端时间碰到了该漏洞,记录一下! 二、漏洞介绍 该漏洞为思科ASA设备和FTD设备的未授权任意文件读取漏洞,但仅能读取到 WEB 目录下的文件,影响版本如下: Cisco…

    Linux 2023年6月8日
    092
  • JuiceFS 缓存预热详解

    缓存预热是一个比较常见的概念,相信很多小伙伴都有所了解。对于 JuiceFS 来说,缓存预热就是将需要操作的数据预先从对象存储拉取到本地,从而获得与使用本地存储类似的性能表现。 缓…

    Linux 2023年6月14日
    085
  • python写日志

    写日志的办法多种多样,我这个是我喜欢的办法,可以做个参考 没啥说的,直接上代码 import time def write_log(value): now_time = time….

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