堆栈

目录:

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)

大家都在看

  • 【Java】关于Maven仓库地址

    Maven仓库地址 仓库 如果你没有配置阿里云仓库镜像源,可以到这里来找 https://mvnrepository.com/ 如果你配置了阿里云仓库镜像源,可以来这里找 http…

    Linux 2023年6月14日
    0104
  • grep

    grep &#x57FA;&#x672C;&#x5339;&#x914D;&#xFF1A; grep a*re hello.txt –* …

    Linux 2023年6月11日
    084
  • Go 字符串切割技巧

    标准库专门提供了一个包 strings 进行字符串的操作,随着go1.18新增的 Cut 函数,字符串处理也更加方便了。 Cut 函数的签名如下: 将字符串 s 在第一个 sep …

    Linux 2023年6月6日
    088
  • linux与windows的批处理应用

    本文主要记录一下,不同服务器部署springboot项目时,用到的批处理命令 linux,针对maven-assembly-plugin打的tar.gz包的springboot项目…

    Linux 2023年6月14日
    0102
  • 继承、封装、多态的实现原理

    欢迎来到Java学习之继承、封装、多态的实现原理 目录 从JVM结构开始谈多态 JVM 的结构 Java 的方法调用方式 常量池(constant pool) 图 2. 常量池各表…

    Linux 2023年6月13日
    0113
  • [20220106]ora-00600 kokasgi1.txt

    [20220106]ora-00600 kokasgi1.txt –//上午看了https://www.xifenfei.com/2022/01/2022-first-…

    Linux 2023年6月13日
    094
  • 领导:谁再用redis过期监听实现关闭订单,立马滚蛋!

    在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝、某东都有这样的逻辑,而且时间很准确,误差在1s内;…

    Linux 2023年5月28日
    094
  • vim的使用

    1、概述: Vim 是从 vi 发展出来的一个文本编辑器。具有代码补全、编译及错误跳转等功能 2、vim编辑器的常用命令: 图源:https://vimsky.com/articl…

    Linux 2023年5月27日
    0133
  • python 练习题:请利用循环依次对list中的每个名字打印出Hello, xxx!

    方法一: python;gutter:true; -<em>- coding: utf-8 -</em>- 请利用循环依次对list中的每个名字打印出Hel…

    Linux 2023年6月8日
    0103
  • Java50个关键字之final

    1)final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能再派生出新的子类)。 final属性:被final修饰的变量不可变,由于不可变有两重含义,…

    Linux 2023年6月7日
    099
  • 搭建Nginx七层反向代理

    基于https://www.cnblogs.com/Dfengshuo/p/11911406.html这个基础上,在来补充下七层代理的配置方式。简单理解下四层和七层协议负载的区别吧…

    Linux 2023年6月8日
    0125
  • 学习一下 JVM (三) — 了解一下 垃圾回收

    一、简单了解几个概念 1、什么是垃圾(Garbage)?什么是垃圾回收(Garbage Collection,简称 GC)? (1)什么是垃圾(Garbage)?这里的垃圾 指的是…

    Linux 2023年6月11日
    0103
  • Tomcat

    Tomcat Tomcat tomcat简介 tomcat的用处 部署tomcat 测试访问 访问Host Manager界面 访问Server Status tomcat简介 T…

    Linux 2023年6月6日
    0137
  • 学习一下 SpringCloud (二)– 服务注册中心 Eureka、Zookeeper、Consul、Nacos

    (1) 相关博文地址: 学习一下 SpringCloud (一)– 从单体架构到微服务架构、代码拆分(maven 聚合): https://www.cnblogs.com/l-y…

    Linux 2023年6月11日
    0114
  • Go函数下篇:defer和闭包

    package main import "fmt" func work() int { num := 10 defer func(i int) { i += 2…

    Linux 2023年6月7日
    095
  • OpenStack 命令行操作

    命令行删除 环境变量 OpenStack的九个组件必须熟记,命令不需要死记硬背,我们可以通过help来查询相关的命令和参数。如果你直接使用命令来查询或者做其他操作,那么会涉及到环境…

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