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;
    }
    复制代码

    结果

     
     
  • 相关阅读:
    C++ CGI Helloword
    国内外12个免费域名解析服务网站推荐
    U制作LFS linux
    LFS 中文版手册发布:如何打造自己的 Linux 发行版
    windows下的BT服务器搭建方案
    Linux下搭建BT服务器
    Codeforces 842B Gleb And Pizza【几何,水】
    Codeforces 842A Kirill And The Game【暴力,水】
    Wannafly模拟赛 A.矩阵(二分答案+hash)
    数据结构学习笔记【持续更新】
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3530459.html
Copyright © 2011-2022 走看看