zoukankan      html  css  js  c++  java
  • 特殊堆栈 模拟

    堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除)。本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的中值。给定 N 个元素,如果 N 是偶数,则中值定义为第 N/2 小元;若是奇数,则为第 (N+1)/2 小元。

    输入格式:

    输入的第一行是正整数 N(105​​)。随后 N 行,每行给出一句指令,为以下 3 种之一:

    Push key
    Pop
    PeekMedian
    

    其中 key 是不超过 105​​ 的正整数;Push 表示“入栈”;Pop 表示“出栈”;PeekMedian 表示“取中值”。

    输出格式:

    对每个 Push 操作,将 key 插入堆栈,无需输出;对每个 Pop 或 PeekMedian 操作,在一行中输出相应的返回值。若操作非法,则对应输出 Invalid

    输入样例:

    17
    Pop
    PeekMedian
    Push 3
    PeekMedian
    Push 2
    PeekMedian
    Push 1
    PeekMedian
    Pop
    Pop
    Push 5
    Push 4
    PeekMedian
    Pop
    Pop
    Pop
    Pop
    

    输出样例:

    Invalid
    Invalid
    3
    2
    2
    1
    2
    4
    4
    5
    3
    Invalid
    
     
    这题加深了我对STL的理解  
    虽然题目说是栈 但以我的水平不会用栈做   关键是取中间值
    取中间值用set模拟很方便 但是又维护不了出栈入栈
     
    可以用vector 模拟  得要两个vector
    一个模拟栈  这个很方便 pushback popback即可
    还有一个维护升序   用lower-bound取中间值
     
    注意: v,erase(i)  i为下标
     
    迭代器: vector<int>::iterator it
     
    还有就是注意vector 中insert的操作  
     
    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define LL long long
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    
    int main()
    {
      vector<int>v,v2;
      int n;cin>>n;
      char s[100];
      vector<int>::iterator it;
      while(n--)
      {
          RS(s);
          if(s[1]=='o')
          {
              if(v.size()==0)printf("Invalid
    ");
              else
              {
                  cout<<v[v.size()-1 ]<<endl;
                  it=lower_bound(v2.begin(),v2.end(),v[v.size()-1] );
                  v2.erase(it);
                  v.pop_back();
              }
          }
          if(s[1]=='u')
          {
              int a;cin>>a;
              v.push_back(a);
              it=lower_bound(v2.begin(),v2.end(),a );
              v2.insert(it,a);
          }
          if(s[1]=='e')
          {
              if(v.size()==0)printf("Invalid
    ");
              else
              {
                   if(v2.size() % 2 == 0)
                    printf("%d
    ",v2[v2.size()/2-1]);
                else
                    printf("%d
    ",v2[v2.size()/2]);
              }
          }
      }
        return 0;
    }
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    电子商务:不只是一个网站那么简单
    sqlserver中使用查询分析器的一点小技巧
    以成败论英雄
    SEO 工具集合
    网页中常用JAVASCRIPT技巧
    调用样式表(基础)
    【转载】fontsize:100%有什么作用
    Div+CSS常见错误
    css简单的总结
    【转载】网页尺寸规范
  • 原文地址:https://www.cnblogs.com/bxd123/p/10525123.html
Copyright © 2011-2022 走看看