zoukankan      html  css  js  c++  java
  • 快速的到栈、队列的最大值

    特点

    栈——先进后出

    队列——后进先出

    思路

    1. 快速得到最大值的栈

    结构

    1. 需要两个数组:一个数组stackItem保存栈的元素,另一个数组link2NextMaxValueIndex保存下一个最大值的位置
    2. 两个指针:一个为stackTop指向栈顶,另一个为maxValueIndex指向最大值的下标

    操作

    1. 插入时:比较插入元素与最大值的大小,如果比最大值还大呢,link2NextMaxValueIndex指向原来最大值的位置(即maxValueIndex),而maxValueIndex变为现在插入元素的位置;否则link2NextMaxValueIndex指向-1
    2. 删除时:删除元素的位置出,如果maxValueIndex与当前位置相同,此时maxValueIndex为link2NextMaxValueIndex[satckTop]
    3. 返回栈的最大元素

    图示

    以入栈2 7 1,出栈为例:

     

    代码

    复制代码
    #include <iostream>
    #include <climits>
    #define MAX 100
    using namespace std;
    
    class stack
    {
        public:
            stack() : stackTop(-1), maxValueIndex(-1) {}    
            void push(int val);
            int pop();
            int max();
            int size() { return stackTop + 1; }
            int empty() { return stackTop < 0 ? 1 : 0; }
        private:
            int stackItem[MAX];
            int link2NextMaxValueIndex[MAX];
            int stackTop;
            int maxValueIndex;
    };
    
    void stack::push(int val)
    {
        ++stackTop;
        if(stackTop == MAX)
        {
            cout << "The stack has been full!" << endl;
            return;
        }
        else
        {
            stackItem[stackTop] = val;
            if(max() < val)
            {
                link2NextMaxValueIndex[stackTop] = maxValueIndex;
                maxValueIndex = stackTop;
            }
            else
                link2NextMaxValueIndex[stackTop] = -1;
        }
    }
    int stack::pop()
    {
        int ret; 
        if(stackTop == -1)
        {
            cout << "The stack is empty!" << endl;
            return -1;
        }
        else
        {
            ret = stackItem[stackTop];
            if(stackTop == maxValueIndex)
                maxValueIndex = link2NextMaxValueIndex[stackTop];
            --stackTop;
            return ret;
        }
    }
    int stack::max()
    {
        if(maxValueIndex >= 0)
            return stackItem[maxValueIndex];
        else
            return INT_MIN;
    }
    
    
    int main()
    {
        stack s;
        cout << "s.empty():" << s.empty() << endl;
        s.push(3);
        s.push(4);
        cout << "s.top():" << s.pop() << endl;
        cout << "s.top():" << s.pop() << endl;
        cout << "s.top():" << s.pop() << endl;
        cout << "s.size():" << s.size() << endl;
        cout << "s.empty():" << s.empty() << endl;
    }
    复制代码

    结果

    2. 快速得到最大值的队列

    两个栈可以实现队列(参考),就用刚才的栈实现队列

    代码

    复制代码
    #include <iostream>
    #include <climits>
    #define MAX 100
    using namespace std;
    
    class stack
    {
        public:
            stack() : stackTop(-1), maxValueIndex(-1) {}    
            void push(int val);
            int pop();
            int max();
            int size() { return stackTop + 1; }
            int empty() { return stackTop < 0 ? 1 : 0; }
        private:
            int stackItem[MAX];
            int link2NextMaxValueIndex[MAX];
            int stackTop;
            int maxValueIndex;
    };
    class queue
    {
        public:
            void enQueue(int val);
            int deQueue();
            int size() { return stackIn.size() + stackOut.size(); }
        private:
            stack stackIn;
            stack stackOut;
    };
    
    void stack::push(int val)
    {
        ++stackTop;
        if(stackTop == MAX)
        {
            cout << "The stack has been full!" << endl;
            return;
        }
        else
        {
            stackItem[stackTop] = val;
            if(max() < val)
            {
                link2NextMaxValueIndex[stackTop] = maxValueIndex;
                maxValueIndex = stackTop;
            }
            else
                link2NextMaxValueIndex[stackTop] = -1;
        }
    }
    int stack::pop()
    {
        int ret; 
        if(stackTop == -1)
        {
            cout << "The stack is empty!" << endl;
            return -1;
        }
        else
        {
            ret = stackItem[stackTop];
            if(stackTop == maxValueIndex)
                maxValueIndex = link2NextMaxValueIndex[stackTop];
            --stackTop;
            return ret;
        }
    }
    int stack::max()
    {
        if(maxValueIndex >= 0)
            return stackItem[maxValueIndex];
        else
            return -100;
    }
    
    void queue::enQueue(int val)
    {
        stackIn.push(val);
    }
    
    int queue::deQueue()
    {
        if(stackOut.empty() and !stackIn.empty())
        {
            while(!stackIn.empty())
                stackOut.push(stackIn.pop());
        }
        return stackOut.pop();
    }
    
    int main()
    {
        stack s;
        cout << "s.empty():" << s.empty() << endl;
        s.push(3);
        s.push(4);
        cout << "s.top():" << s.pop() << endl;
        cout << "s.top():" << s.pop() << endl;
        cout << "s.top():" << s.pop() << endl;
        cout << "s.size():" << s.size() << endl;
        cout << "s.empty():" << s.empty() << endl;
        queue q;
        q.enQueue(1);
        q.enQueue(2);
        q.enQueue(3);
        cout << "q.size()" << q.size() << endl;
        q.deQueue();
        cout << "q.size()" << q.size() << endl;
    }
    复制代码

    结果

  • 相关阅读:
    一些你可能用到的代码
    iOS 键盘下去的方法
    iOS设计模式汇总
    随笔
    Spring cloud config 分布式配置中心 (三) 总结
    Spring cloud config 分布式配置中心(二) 客户端
    Spring cloud config 分布式配置中心(一) 服务端
    jdbcUrl is required with driverClassName spring boot 2.0版本
    JpaRepository接口找不到 spring boot 项目
    解决IntelliJ “Initialization failed for 'https://start.spring.io'
  • 原文地址:https://www.cnblogs.com/ghostll/p/3529951.html
Copyright © 2011-2022 走看看