《剑指offer》–栈队列堆
- 用两个栈实现队列
- 包含 min 函数的栈
- 栈的压入、弹出序列
- 最小的 K 个数
- 数据流中的中位数
- 字符流中第一个不重复的字符
- 滑动窗口的最大值
#include<vector>
#include<stack>
#include<sstream>
#include<string>
#include<algorithm>
#include <queue>
using namespace std;
class MyQueue {
private:
stack<int> stack1, stack2;
public:
MyQueue() {
}
int push(int x)
{
stack1.push(x);
}
int pop() {
if (stack1.empty()) {
while (stack2.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
}
int front = stack2.top();
stack2.pop();
return front;
}
int top() {
if (stack1.empty()) {
while (stack2.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
}
return stack2.top();
}
int empty()
{
return stack1.empty() && stack2.empty();
}
};
class MinStack {
private:
stack<int> dataStack, minStack;
public:
MinStack() {
}
void push(int node) {
dataStack.push(node);
int temp = minStack.top();
minStack.push(minStack.empty() ? node :min(temp, node));
}
void pop() {
dataStack.pop();
minStack.pop();
}
int top() {
return dataStack.top();
}
int minstack() {
return minStack.top();
}
};
bool IsPopOrder(vector<int> pushSequence, vector<int> popSequence)
{
stack<int>pushs;
int n = pushSequence.size();
for (int pushIndex = 0, popIndex = 0; pushIndex < n;pushIndex++ ) {
pushs.push(pushSequence[pushIndex]);
while (popIndex<n && !pushs.empty() && pushs.top() == popSequence[popIndex])
{
pushs.pop();
popIndex++;
}
}
cout << pushs.empty() << endl;
return pushs.empty();
}
vector<int> GetLeastNumbers_Solution(vector<int>&nums, int k) {
priority_queue<int> pq;
for (int i = 0; i < k; i++) {
pq.push(nums[i]);
}
for (int i = k; i < nums.size(); i++) {
if (nums[i] < pq.top()) {
pq.pop();
pq.push(nums[i]);
}
}
vector<int> res;
while (!pq.empty()) {
res.push_back(pq.top());
pq.pop();
}
reverse(res.begin(), res.end());
return res;
}
class MedianFinder {
public:
MedianFinder() {
}
void addNum(int num) {
if (maxHeap.empty() || num <= maxHeap.top()) {
maxHeap.push(num);
}
else {
minHeap.push(num);
}
if (maxHeap.size() > minHeap.size() + 1) {
minHeap.push(maxHeap.top());
maxHeap.pop();
}
else if (minHeap.size() > maxHeap.size() + 1) {
maxHeap.push(minHeap.top());
minHeap.pop();
}
}
double findMedian() {
if (maxHeap.size() == minHeap.size()) {
return (maxHeap.top() + minHeap.top()) / 2.0;
}
else if (maxHeap.size() > minHeap.size()) {
return maxHeap.top();
}
else {
return minHeap.top();
}
}
private:
std::priority_queue<int, std::vector<int>, std::less<int>> maxHeap;
std::priority_queue<int, std::vector<int>, std::greater<int>> minHeap;
};
class FirstAppearingOnce{
private:
int cnts[128] = { 0 };
queue<int> meQueue;
public:
void Insert(char ch) {
cnts[ch]++;
meQueue.push(ch);
while (!meQueue.empty() && cnts[meQueue.front()] > 1)
meQueue.pop();
}
char FirstAppearinOne() {
return meQueue.empty() ? '#' : meQueue.front();
}
};
int maxInwondows(vector<int> nums, int k, vector<int> &result)
{
vector<int> res;
deque<int> q;
for (int i = 0; i < nums.size(); i++) {
while (!q.empty() && nums[q.back()] <= nums[i]) {
q.pop_back();
}
q.push_back(i);
if (q.front() <= i - k) {
q.pop_front();
}
if (i >= k - 1) {
res.push_back(nums[q.front()]);
}
}
return 0;
}
void test_GetLeastNumbers_Solution()
{
vector<int> nums = { 3, 2, 1, 5, 4, 2, 6, 7, 2 };
int k = 4;
vector<int> res = GetLeastNumbers_Solution(nums, k);
for (int i = 0; i < res.size(); i++) {
cout << res[i] << " ";
}
cout << endl;
}
int main()
{
test_GetLeastNumbers_Solution();
getchar();
return 0;
}