zoukankan      html  css  js  c++  java
  • 编程之美---队列中取最大值操作问题

    如何快速获取队列中的最大值?

    最简单的办法,用一个for循环遍历,复杂度为o(n).

    解法二:用大顶堆来实现,复杂度为哦o(1),但是入队和出队复杂度变为o(logN),堆中的每一个元素还得有个指针指向它的后继元素。

    解法三:可以使用两个栈来模拟队列,从右边的栈进入元素相当于入队,出队时,只有当左边的栈为空时,才把右边栈的元素全部出栈到左边的栈。

     1 class stack
     2 {
     3 public:
     4     stack()
     5     {
     6         stackTop = -1;
     7         maxItemIndex = -1;
     8     } 
     9     void Push(int x)
    10     {
    11         stackTop ++;
    12         if(stackTop >= MAXN) 
    13             ;
    14         else
    15         {
    16             items[stackTop]=x;
    17             if(x>Max())
    18             {
    19                 nextMaxItem[stackTop] = maxItemIndex;
    20                 maxItemIndex = stackTop;
    21             }
    22             else nextMaxItem[stackTop] = -1;
    23         }
    24     } 
    25     int Pop()
    26     {
    27         int x;
    28         if(stackTop < 0) return -1;
    29         else
    30         {
    31             x = items[stackTop];
    32             if(stackTop == maxItemIndex)
    33             {
    34                 maxItemIndex = nextMaxItem[stackTop];
    35             }
    36             stackTop--;
    37         }
    38         return x;
    39     } 
    40     int Max()
    41     {
    42         if(maxItemIndex >= 0) return items[maxItemIndex];
    43         else return -1;
    44     } 
    45     bool empty()
    46     {
    47         return stackTop == -1;
    48     }  
    49 private:
    50     int items[MAXN];
    51     int stackTop;
    52     int nextMaxItem[MAXN];
    53     int maxItemIndex;
    54 };
    55 class Queue
    56 {
    57 public:
    58     void Enqueue(int x)
    59     {
    60         B.Push(x);
    61     } 
    62     int Dequeue()
    63     {
    64         if(A.empty())
    65         {
    66             while(!B.empty())
    67             {
    68                 A.Push(B.Pop());
    69             }
    70         }
    71         return A.Pop();
    72     } 
    73     int Max()
    74     {
    75         if(A.Max() >= B.Max()) return A.Max();
    76         else return B.Max();
    77     } 
    78     private:
    79     stack A;
    80     stack B;
    81 };
    View Code
  • 相关阅读:
    css
    Git使用
    Github入门
    flask框架预备知识
    django框架预备知识
    JSON格式
    盒模型详解
    position属性详解
    float属性详解
    display属性详解
  • 原文地址:https://www.cnblogs.com/wen-ge/p/4161099.html
Copyright © 2011-2022 走看看