堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除)。本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的中值。给定 N 个元素,如果 N 是偶数,则中值定义为第 N/2 小元;若是奇数,则为第 (N+1)/2 小元。
输入的第一行是正整数 N(≤10?5??)。随后 N 行,每行给出一句指令,为以下 3 种之一:
Push key
Pop
PeekMedian
其中 key
是不超过 10?5?? 的正整数;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
①关于lower_bound(begin,end,num):
从数组的begin位置到end-1位置二分查找第一个≥num的元素,找到则返回该元素的地址,不存在则返回end。
②关于vector.insert(it,val):
在指定位置it(迭代器)前插入值为val的元素,并返回指向这个元素的迭代器。
#include<bits/stdc++.h> using namespace std; vector<int>st,value; vector<int>::iterator it; int main() { int n,x; string op; cin>>n; while(n--) { cin>>op; if(op=="Push") { cin>>x; it=lower_bound(value.begin(),value.end(),x); value.insert(it,x); st.push_back(x); } else if(op=="PeekMedian") { if(st.size()==0)cout<<"Invalid"; else { int v=value.size(); if(v%2) cout<<value[v/2]; else cout<<value[v/2-1]; } cout<<endl; } else { if(st.size()==0)cout<<"Invalid"; else { cout<<st[st.size()-1]; it=lower_bound(value.begin(),value.end(),st[st.size()-1]); value.erase(it); st.pop_back(); } cout<<endl; } } return 0; }
原文:https://www.cnblogs.com/kannyi/p/10424485.html