编程之美---队列中取最大值操作问题

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

最简单的办法,用一个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

 

posted @ 2014-12-13 11:17  智者无惧  阅读(170)  评论(0编辑  收藏  举报