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

/*                                                                                          
 * 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值