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

简介: 1 思路: 自己实现一个栈,其中成员为标准库中的栈,一个存放全部的元素,一个存放最小元素,一个存放最大元素。 使用自己实现的栈来实现一个求最大值最小值的队列,其中包含两个成员,一个作为出队的栈,一个作为入队的栈。

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;
}

 

相关文章
|
6月前
|
算法 程序员 测试技术
【数据结构-队列 二】【单调队列】滑动窗口最大值
【数据结构-队列 二】【单调队列】滑动窗口最大值
76 0
|
11月前
|
算法 测试技术 C#
C++二分查找算法的应用:长度递增组的最大数目
C++二分查找算法的应用:长度递增组的最大数目
【Leetcode -1171.从链表中删去总和值为零的连续节点 -1669.合并两个链表】
【Leetcode -1171.从链表中删去总和值为零的连续节点 -1669.合并两个链表】
100 0
|
5月前
|
索引
队列的数组实现
队列的数组实现
23 0
|
6月前
|
算法 测试技术 C#
【map】【滑动窗口】C++算法:最小区间
【map】【滑动窗口】C++算法:最小区间
|
消息中间件 前端开发 JavaScript
使用数组实现队列
使用数组实现队列
61 0
|
算法 JavaScript
辛辣天塞!滑动窗口之【和的最大值】&【最大值集合】
本篇带来两道经典的关于滑动窗口的算法题,有兴趣可在控制台跑一跑~
队列的最大值(剑指offer59-II)
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。 若队列为空,pop_front 和 max_value 需要返回 -1
130 0
栈与队列——239. 滑动窗口最大值
本专栏按照数组—链表—哈希—字符串—栈与队列—二叉树—回溯—贪心—动态规划—单调栈的顺序刷题,采用代码随想录所给的刷题顺序,一个正确的刷题顺序对算法学习是非常重要的,希望对大家有帮助
栈与队列——239. 滑动窗口最大值