代码改变世界

Min Stack

2015-04-07 13:08  笨笨的老兔子  阅读(157)  评论(0编辑  收藏  举报

设计一个最小堆,要求实现push、pop、top、getMin几个功能。

思路:主要问题在于getMin,必须是一个常数级的查找返回,因此最好是每push一个就和当前min进行比较,始终保存min。

  1. class MinStack {
  2. public:
  3. MinStack()
  4. {
  5. head = new ListNode(INT_MAX);
  6. }
  7. void push(int x) {
  8. ListNode* tmpNode=new ListNode(x);
  9. if (x < head->val)
  10. {
  11. head->val = x;
  12. }
  13. tmpNode->next = head->next;
  14. head->next = tmpNode;
  15. }
  16. void pop() {
  17. if (head->next )
  18. {
  19. if (head->val == head->next->val)
  20. {
  21. ListNode* tmp = head->next->next;
  22. head->val = INT_MAX;
  23. while (tmp)
  24. {
  25. if (tmp->val < head->val)
  26. head->val = tmp->val;
  27. tmp = tmp->next;
  28. }
  29. }
  30. head->next = head->next->next;
  31. }
  32. }
  33. int top() {
  34. if (head->next)
  35. return head->next->val;
  36. }
  37. int getMin() {
  38. if (head->next)
  39. return head->val;
  40. }
  41. private:
  42. struct ListNode {
  43. int val;
  44. ListNode *next;
  45. ListNode(int x) : val(x), next(NULL) {}
  46. };
  47. ListNode* head;
  48. };