• 可以随时查找的max栈和max队列——面试


    这是面试中比较常见的题目,max队列也是编程之美里的一道题

    对于max的栈,有个比较简单的办法就是,每次入栈前判断栈顶元素与正在入栈的元素哪个大,哪个大就哪个入栈 

    对于队列,我们知道可以用两个栈来实现,这时,我想到是否可以用栈来维护max的队列

    结果是可以的,不过要用三个栈, 1 +2  ,前一个max栈+ (后一个max栈+普通的栈) ,每次寻找max都在前一个max栈和后一个max栈中找,而要更新前一个栈的时候,要把普通的栈来去更新

    考虑 1,2,4,3  

    进1进2进4进3出1出2出4

                      大4大4大3

    /*
    10
    push 1
    push 2
    push 4
    push 2
    pop
    max
    pop
    max
    pop
    max
    */
    
    #include<iostream>
    #include<stack>
    #include<queue>
    using namespace std;
    
    //push 
    //pop
    //max
    struct data{
        int v;
    };
    
    stack<data>first,end;
    stack<data>sta;
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF){
            int i,shu;data temp;
            char str[10];
            for(i=1;i<=n;i++){
                scanf("%s",&str);
    
                if(end.empty()&&(!sta.empty())){ //第二个堆空的时候把第一个普通堆放到第二个堆里
    
                    end.push(sta.top());
                    sta.pop();
                    first.pop();
                    while(!sta.empty()){
                        temp=end.top();
                        if(temp.v<sta.top().v){
                            temp=sta.top();
                        }
                        end.push(temp);
                        sta.pop();
                        first.pop();
                    }
                }
    
                if(str[1]=='u'){
                    scanf("%d",&shu);
                    temp.v=shu;
                    sta.push(temp);
                    if(!first.empty()){
                        if(first.top().v>temp.v)temp=first.top();
                        first.push(temp);
                    }else{
                        first.push(temp);
                    }
                }else if(str[1]=='o') {
                    end.pop();
                }else{//max
                    if(!first.empty()){
                        temp=first.top();
                        if(temp.v<end.top().v)temp=end.top();
                    }else{
                        temp=end.top();
                    }
                    printf("%d
    ",temp.v);
                }
            }
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    C++面向对象高级编程(下)第二周-Geekband
    C++面向对象高级编程(下)第一周-Geekband
    C++面向对象高级编程(下)-Geekband
    堆,栈,内存管理, 拓展补充-Geekband
    C++面向对象高级编程(上)-Geekband
    MFC 多屏显示
    Open CASCADE Technology: IGES Support
    JAVA反射
    HashMap
    Linux 系统编程
  • 原文地址:https://www.cnblogs.com/huhuuu/p/3397441.html
Copyright © 2020-2023  润新知