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

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;
}
时间: 2024-10-08 13:29:00

双栈队列实现快速获取队列最大值最小值的相关文章

【08】双栈实现队列

题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,deleteHead?操作返回 -1 ) 思路 一个入栈,一个出栈 收获 java的Stack pop方法会返回出栈的值. 代码 class CQueue { Stack<Integer> appendTailStack; Stack<Integer> deleteHeadStack; publi

数据结构&amp;算法(一)_堆、栈(堆栈)、队列、链表

堆: ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树.将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆.常见的堆有二叉堆.斐波那契堆等. ②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间.即动态分配内存,对其访问和对一般内存的访问没有区别. ③堆是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程. ④堆是指程序运行时申请的动态内存,而栈只是指一种使用

算法(第四版)C#题解&mdash;&mdash;1.3.49 用 6 个栈实现一个 O(1) 队列

因为这个解法有点复杂,因此单独开一贴介绍. <算法(第四版)>中的题目是这样的: 1.3.49 栈与队列.用有限个栈实现一个队列,保证每个队列操作(在最坏情况下)都只需要常数次的栈操作. 那么这里就使用六个栈来解决这个问题. 这个算法来自于这篇论文. 原文里用的是 Pure Lisp,不过语法很简单,还是很容易看懂的. 先导知识--用两个栈模拟一个队列 如何使用两个栈来模拟一个队列操作? 这是一道很经典的题目,答案也有很多种,这里只介绍之后会用到的一种方法. 首先我们有两个栈,H 和 T,分别

两个栈实现一个队列和两个队列实现一个栈【算法导论课后题】

关于两个栈实现一个队列和两个队列实现一个栈问题,网上有很多资料.这里只描述自己认为操作最少的方法. 两个栈实现一个队列 思想:假设两个栈分别为s1,s2.对s1进行入队,出队时,先判断s2是否为空,如果是则将s1中元素压入s2并弹出最上面元素,如果不是,则直接弹出s2最上面的元素. <span style="font-size:18px;">EnQueue(s1,s2,k){ push(s1,k)</span><span style="font-

两个栈模拟一个队列和两个队列模拟一个栈

此为网易的一道笔试题.到时候秀逗,不知所云.后来研究之后记录下,以备以后经常翻阅. 栈:先进后出 push和pop 队列:先进先出 offer和poll (1)两个栈模拟一个队列 即将先进后出实现先进先出.比较容易理解,只要所有数据先往一个栈里push,然后将该栈中的数据依次pop出来再push进第二个队列,则顺序自然颠倒过来了,则每次pop是从第二个队列中取数据. import java.util.*; public class StackQueue{ private Stack<Intege

用两个栈实现一个队列 &amp; 用两个队列实现一个栈

队列(先进先出)和栈(先进后出)都是常用的经常讨论的基本的数据结构,本文要讨论的是一对有趣的问题:如何用两个栈(队列)实现一个队列(栈),下面将分别说明,并附示例代码. 1.用两个栈实现一个队列 基本思路:初始有两个空栈s1和s2,当入队列是,将元素加入s1,而出队列则从s2出,当然s1与s2之间存在一定的交互. 入队:元素压入栈s1即可. 出队:首先看s2是否为空,若s2为空,则依次弹出s1的元素,加入s2中:若不为空,则不需额外处理: 之后弹出s2中的栈顶元素(即为队列的首元素)删除即可.

Algorithm --&gt; 两个栈实现队列和两个队列实现栈

两个栈实现队列和两个队列实现栈 队列(queue)先进先出的线性表:栈(stack)先进后出的线性表. 两个栈实现队列 法一思路: s1是入栈的,s2是出栈的. 入队列:直接压入s1即可: 出队列:如果s2不为空,把s2中的栈顶元素直接弹出:否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素. 代码: #include <stack> #include <iostream> #include <cassert> using namespace std; te

使用rabbitmq手动确认消息的,定时获取队列消息实现

描述问题 最近项目中因为有些数据,需要推送到第三方系统中,因为数据会一直增加,并且需要与第三方系统做相关交互. 相关业务 本着不影响线上运行效率的思想,我们将增加的消息放入rabbitmq,使用另一个应用获取消费,因为数据只是推送,并且业务的数据有15分钟左右的更新策略,对实时性不是很高所以我们需要一个定时任务来主动链接rabbit去消费,然后将数据以网络方式传送 相关分析 网络上大致出现了相关的解决办法,但由于实现相关数据丢失及处理.性能和效率等相关基础业务的工作量,望而却步...... 还好

栈(Stack)和队列

栈是一个后进先出的线性表,它要求只在表尾进行删除和插入操作. 所谓的栈,其实就是一个特殊的线性表.表尾称为栈顶(Top),相应的表头称为栈底(Bottom). 栈的插入(Push),栈的删除(Pop).最开始栈中不包含任何数据,称为空栈,此时栈顶就是栈底,然后数据从栈顶进入,栈顶和栈底分离.数据出栈时从栈顶弹出,栈顶下移,整个栈的当前容量变小. 入栈操作在栈顶进行,每次向栈中压入一个数据,top指针加1,直到栈满为止. 出栈操作就是在栈顶取出数据,栈顶指针下移,栈的当前容量-1. 逆波兰表达式: