编程之美-队列中取最大值操作问题

/*                                                                                          
 * Usage:
 * ./stack_queue 
#include
#include
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 elements;
  stack 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

你可能感兴趣的:(编程之美-队列中取最大值操作问题)