/*
* Usage:
* ./stack_queue <input.txt
*
* input.txt:
* 10 3 4 1 7
*/
#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;
#define MAXNUM 100000
struct StackGetMin {
void push(int x) {
elements.push(x);
if (minStack.empty() || x <= minStack.top())
minStack.push(x);
}
bool pop() {
if (elements.empty()) return false;
if (elements.top() == minStack.top())
minStack.pop();
elements.pop();
return true;
}
bool getMin(int &min) {
if (minStack.empty()) {
return false;
} else {
min = minStack.top();
return true;
}
}
bool empty() {
if(minStack.empty())
return true;
else
return false;
}
int top() {
return elements.top();
}
stack<int> elements;
stack<int> minStack;
};
struct minQueue {
bool getMin(int &m) {
int a,b;
if(!A.getMin(a)) a = MAXNUM;
if(!B.getMin(b)) b = MAXNUM;
m = min(a,b);
return true;
}
void enqueue(int x) {
B.push(x);
}
int dequeue() {
if (A.empty()) {
while(!B.empty()) {
A.push(B.top());
B.pop();
}
}
int ret = A.top();
A.pop();
return ret;
书中给出了三种解法,分别是传统方法、最大堆和用双栈的方法。其中,第三种解法满足了入队、出队和取最大值都是O(1)的条件。基于[1],测试了一下。
代码:
参考资料
1. http://www.leetcode.com/2010/11/stack-that-supports-push-pop-and-getmin.html