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