zoukankan      html  css  js  c++  java
  • 队列中取最大值操作

    编程之美3.7

    队列的常用操作只有两个入队列EnQueue(v)和出队列DeQueue(v),这里需要增加一个取最大值的操作,而且使时间复杂度尽可能的小

    考虑到之前遇到过的,为栈设计取最大值问题,只需要用另外一个栈来记录当前栈中的最大值,当入栈时,如果入栈元素大于栈中最大元素则更新最大值,出栈时,如果出栈元素等于栈中最大元素则同时将记录最值的栈出栈

    而队列想要实现此功能则要复杂的多,想到可以借用栈来实现队列的最值问题。

    用两个栈A,B来模拟队列的出队和入队操作,入队列时,将元素直接放入A栈中,出队时,首先判断栈B是否为空,如果为空则将A栈中的元素依次出栈在压入B栈中,然后再从B栈中去掉一个元素

    分别用一个栈C,D来记录栈A和B的最值,整个队列的最大值,应该是栈A和栈B中的最大值

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 
     5 #define MIN -999999
     6 
     7 vector<int> a,b;
     8 vector<int> c,d;
     9 void initial()
    10 {
    11     c.push_back(MIN);
    12     d.push_back(MIN);
    13 }
    14 
    15 void push(int t)
    16 {
    17     a.push_back(t);
    18     if(t>c.back())
    19         c.push_back(t);
    20 }
    21 
    22 int pop()
    23 {
    24     int t;
    25     if(b.empty())
    26     {
    27         while(!a.empty())
    28         {
    29             t=a.back();
    30             a.pop_back();
    31             if(t==c.back())
    32                 c.pop_back();
    33             b.push_back(t);
    34             if(t>d.back())
    35                 d.push_back(t);
    36         }
    37     }
    38     t=b.back();
    39     if(t==d.back())
    40         d.pop_back();
    41     b.pop_back();
    42     return t;
    43 }
    44 
    45 int getmax()
    46 {
    47     return c.back() > d.back() ? c.back():d.back();
    48 }
    49 
    50 int main()
    51 {
    52     initial();
    53     push(1);
    54     cout<<getmax()<<endl;
    55     push(5);
    56     cout<<getmax()<<endl;
    57     push(3);
    58     cout<<getmax()<<endl;
    59     push(4);
    60     cout<<getmax()<<endl;
    61     while(!a.empty() || !b.empty())
    62     {
    63         cout<<pop()<<" ";
    64         cout<<getmax()<<endl;
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    android 中 文件的 MIME 类型 【部分内容】
    Linux下的计划任务 crontab
    监控 某个目录下文件的创建,给据创建的文件进行执行命令
    SUSE下试着搭建了一个web 做个记录
    Android 学习 — Activity
    数据库字段不规范
    浅谈测试团队规范建设
    QA拒绝上线的理由
    Bugzilla安装部署精要
    Linux下部署Bugzilla和TestLink
  • 原文地址:https://www.cnblogs.com/qianye/p/2966807.html
Copyright © 2011-2022 走看看