堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除)。本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的中值。给定 N 个元素,如果 N 是偶数,则中值定义为第 \(\frac{N}2\) 小元;若是奇数,则为第 \(\frac{N+1}2\) 小元。
输入的第一行是正整数 N(\(≤10^5\))。随后 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
思路:使用lower_bound这个函数(使用方法:Here)
// Author : RioTian
// Time : 20/11/08
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
vector<int> v, v1;
string s;
int main() {
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int n, x;
cin >> n;
vector<int>::iterator it;
while (n--) {
cin >> s;
if (s == "Push") {
cin >> x;
v1.push_back(x);
it = lower_bound(v.begin(), v.end(), x);
v.insert(it, x);
} else if (s == "Pop") {
if (v1.size() == 0)
cout << "Invalid" << endl;
else {
it = lower_bound(v.begin(), v.end(), v1[v1.size() - 1]);
v.erase(it);
cout << v1[v1.size() - 1] << endl;
v1.pop_back();
}
} else {
if (v1.size() == 0)
cout << "Invalid" << endl;
else {
if (v.size() % 2 == 0)
cout << v[v.size() / 2 - 1] << endl;
else
cout << v[v.size() / 2] << endl;
}
}
}
}
原文:https://www.cnblogs.com/RioTian/p/13944252.html