队列中取最大值操作

编程之美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 }

 

你可能感兴趣的:(队列)