队列中取最大值操作

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

 

转载于:https://www.cnblogs.com/qianye/archive/2013/03/18/2966807.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值