• 双栈队列实现快速获取队列最大值最小值


    1 思路:

    自己实现一个栈,其中成员为标准库中的栈,一个存放全部的元素,一个存放最小元素,一个存放最大元素。

    使用自己实现的栈来实现一个求最大值最小值的队列,其中包含两个成员,一个作为出队的栈,一个作为入队的栈。

    2 C++实现代码:

    #include<iostream>
    #include<stack>
    #include<cstdlib>
    using namespace std;
    
    template <typename T>
    class minmaxStack
    {
    public:
        bool empty()
        {
            return st.empty();
        }
        size_t size()
        {
            return st.size();
        }
        void push(int x)
        {
            if(minStack.empty()||x<minStack.top())
                minStack.push(x);
            if(maxStack.empty()||x>maxStack.top())
                maxStack.push(x);
            st.push(x);
        }
        void pop()
        {
            if(st.empty())
                return;
            if(st.top()==minStack.top())
                minStack.pop();
            if(st.top()==maxStack.top())
                maxStack.pop();
            st.pop();
        }
        int getMin()
        {
            if(st.empty())
                return -1;
            return minStack.top();
        }
        int getMax()
        {
            if(st.empty())
                return -1;
            return maxStack.top();
        }
        int top()
        {
            return st.top();
        }
    private:
        stack<int> st;
        stack<int> minStack;
        stack<int> maxStack;
    };
    
    template<typename T>
    class myqueue
    {
    public:
        bool empty()
        {
            return in.empty()&&out.empty();
        }
        size_t size()
        {
            return in.size()+out.size();
        }
        int getMax()
        {
            if(in.empty()&&out.empty())
                return -1;
            if(in.empty())
                return out.getMax();
            if(out.empty())
                return in.getMax();
            return max(in.getMax(),out.getMax());
        }
        int getMin()
        {
            if(in.empty()&&out.empty())
                return -1;
            if(in.empty())
                return out.getMin();
            if(out.empty())
                return in.getMin();
            return min(in.getMin(),out.getMin());
        }
        void push(int x)
        {
            in.push(x);
        }
        void pop()
        {
            if(in.empty()&&out.empty())
                return;
            if(out.empty())
            {
                while(!in.empty())
                {
                    out.push(in.top());
                    in.pop();
                }
            }
            out.pop();
        }
    private:
        minmaxStack<int> in;
        minmaxStack<int> out;
    };
    
    int main()
    {
        myqueue<int> q;
        for (int i = 0; i < 15; i++)
        {
            int index=rand()%100;
            cout<<index<<' ';
            q.push(index);
        }
        cout<<q.getMax()<<endl;
        cout<<q.getMin()<<endl;
    }
  • 相关阅读:
    再谈加密-RSA非对称加密的理解和使用
    WEB开发中的字符集和编码
    网页实时聊天之PHP实现websocket
    PHP中的回调函数和匿名函数
    shell实现SSH自动登陆
    初探PHP多进程
    PHP的openssl加密扩展使用小结
    搭建自己的PHP框架心得(三)
    docker 快速搭建Nexus3
    用图形数据库Neo4j 设计权限模块
  • 原文地址:https://www.cnblogs.com/wuchanming/p/4457589.html
Copyright © 2020-2023  润新知