首页 > 代码库 > 算法学习 - 最小栈的实现O(1)时间

算法学习 - 最小栈的实现O(1)时间

  1. //  
  2. //  main.cpp  
  3. //  MinStack2  
  4. //  
  5. //  Created by Alps on 14/12/3.  
  6. //  Copyright (c) 2014年 chen. All rights reserved.  
  7. //  
  8.   
  9. #include <iostream>  
  10. #include <vector>  
  11. using namespace std;  
  12. class MinStack {  
  13. public:  
  14.     vector<int> stack;  
  15.     int min;  
  16.     void push(int x) {  
  17.         if (stack.empty()) {  
  18.             stack.push_back(0);  
  19.             min = x;  
  20.         }else{  
  21.             stack.push_back(x-min);  
  22.             if (x < min) {  
  23.                 min = x;  
  24.             }  
  25.         }  
  26.           
  27.     }  
  28.       
  29.     void pop() {  
  30.         if (stack.empty()) {  
  31.             return;  
  32.         }else{  
  33.             if (stack.back() < 0) {  
  34.                 min = min - stack.back();  
  35.             }  
  36.             stack.pop_back();  
  37.         }  
  38.     }  
  39.       
  40.     int top() {  
  41.         if (stack.empty()) {  
  42.             return NULL;  
  43.         }  
  44.         if (stack.back() > 0) {  
  45.             return stack.back()+min;  
  46.         }else{  
  47.             return min;  
  48.         }  
  49.     }  
  50.       
  51.     int getMin() {  
  52.         if (stack.empty()) {  
  53.             return NULL;  
  54.         }  
  55.         return min;  
  56.     }  
  57. };  
  58.   
  59. int main(int argc, const char * argv[]) {  
  60.     // insert code here...  
  61.     std::cout << "Hello, World!\n";  
  62.     return 0;  
  63. }  


在边缘测试的时候,我的编译器没出错,但是OJ上报WA了。

 

在CODE上查看代码片派生到我的代码片

  1. //  
  2. //  main.cpp  
  3. //  MinStack4_leetcode  
  4. //  
  5. //  Created by Alps on 14/12/3.  
  6. //  Copyright (c) 2014年 chen. All rights reserved.  
  7. //  
  8.   
  9. #include <iostream>  
  10. #include <stack>  
  11. using namespace std;  
  12.   
  13. class MinStack{  
  14. public:  
  15.     stack<long> s;  
  16.     long min;  
  17.     void push(int x){  
  18.         if (s.empty()) {  
  19.             s.push(0);  
  20.             min = x;  
  21.         }else{  
  22.             s.push(x-min);  
  23.             if (x < min) {  
  24.                 min = x;  
  25.             }  
  26.         }  
  27.     }  
  28.       
  29.     void pop(){  
  30.         if (s.empty()) {  
  31.             return;  
  32.         }else{  
  33.             if (s.top() < 0) {  
  34.                 min = min - s.top();  
  35.             }  
  36.             s.pop();  
  37.         }  
  38.     }  
  39.       
  40.     int top(){  
  41.         if (s.empty()) {  
  42.             return NULL;  
  43.         }else{  
  44.             if (s.top() > 0) {  
  45.                 return (int)(min+s.top());  
  46.             }else{  
  47.                 return (int)min;  
  48.             }  
  49.         }  
  50.     }  
  51.       
  52.     int getMin(){  
  53.         if (s.empty()) {  
  54.             return NULL;  
  55.         }else{  
  56.             return (int)min;  
  57.         }  
  58.     }  
  59.       
  60. };  
  61.   
  62. int main(int argc, const char * argv[]) {  
  63.     int a = -2147483648;  
  64.       
  65.     MinStack M;  
  66.     M.push(2147483646);  
  67.     M.push(2147483646);  
  68.     M.push(2147483647);  
  69.     printf("%d\n",M.top());  
  70.     M.pop();  
  71.     printf("%d\n",M.getMin());  
  72.     M.pop();  
  73.     printf("%d\n",M.getMin());  
  74.     M.pop();  
  75.     M.push(2147483647);  
  76.     printf("%d\n",M.top());  
  77.     printf("%d\n",M.getMin());  
  78.     M.push(a);  
  79.     printf("%d\n",M.top());  
  80.     printf("%d\n",M.getMin());  
  81.     M.pop();  
  82.     printf("%d\n",M.getMin());  
  83.     return 0;  
  84. }  



自己写的链表结构体。

 

在CODE上查看代码片派生到我的代码片

  1. //  
  2. //  main.cpp  
  3. //  MinStack3_leetcode  
  4. //  
  5. //  Created by Alps on 14/12/3.  
  6. //  Copyright (c) 2014年 chen. All rights reserved.  
  7. //  
  8.   
  9. #include <iostream>  
  10. using namespace std;  
  11.   
  12. class MinStack {  
  13. public:  
  14.       
  15.     struct StackNode{  
  16.         int num;  
  17.         StackNode *next;  
  18.     };  
  19.     typedef StackNode* stack;  
  20.     stack s;  
  21.     MinStack(){  
  22.         s = (stack)malloc(sizeof(struct StackNode));  
  23.         s->next = NULL;  
  24.     }  
  25.       
  26.     int min;  
  27.     void push(int x) {  
  28.         if (s->next == NULL) {  
  29.             stack node = (stack)malloc(sizeof(struct StackNode));  
  30.             node->num = x;  
  31.             node->next = s->next;  
  32.             s->next = node;  
  33.             min = x;  
  34.         }else{  
  35.             stack node = (stack)malloc(sizeof(struct StackNode));  
  36.             node->num = x;  
  37.             node->next = s->next;  
  38.             s->next = node;  
  39.             if (x < min) {  
  40.                 min = x;  
  41.             }  
  42.         }  
  43.     }  
  44.       
  45.     void pop() {  
  46.         if (s->next == NULL) {  
  47.             return;  
  48.         }else{  
  49.             stack temp = s->next;  
  50.             if (min == s->next->num && s->next->next != NULL) {  
  51.                   
  52.                 s->next = s->next->next;  
  53.                 free(temp);  
  54.                 min = s->next->num;  
  55.                 for (stack loop = s->next; loop != NULL; loop = loop->next) {  
  56.                     if (min > loop->num) {  
  57.                         min = loop->num;  
  58.                     }  
  59.                 }  
  60.             }else{  
  61.                   
  62.                 s->next = s->next->next;  
  63.                 free(temp);  
  64.             }  
  65.               
  66.         }  
  67.     }  
  68.       
  69.     int top() {  
  70.         if (s->next == NULL) {  
  71.             return NULL;  
  72.         }  
  73.         return s->next->num;  
  74.     }  
  75.       
  76.     int getMin() {  
  77.         if (s->next == NULL) {  
  78.             return NULL;  
  79.         }  
  80.         return min;  
  81.     }  
  82. };  
  83.   
  84. int main(int argc, const char * argv[]) {  
  85.     MinStack MinS;  
  86.     MinS.push(-1);  
  87.     MinS.push(0);  
  88.     MinS.push(2);  
  89.     MinS.push(-2);  
  90.     printf("%d\n",MinS.top());  
  91.     MinS.pop();  
  92.     MinS.pop();  
  93.     MinS.pop();  
  94.     printf("%d\n",MinS.getMin());  
  95.     return 0;  
  96. }  



最古老的版本。

 

在CODE上查看代码片派生到我的代码片

    1. //  
    2. //  main.cpp  
    3. //  MinStack_leetcode  
    4. //  
    5. //  Created by Alps on 14/12/2.  
    6. //  Copyright (c) 2014年 chen. All rights reserved.  
    7. //  
    8.   
    9. #include <iostream>  
    10. #include "vector"  
    11. using namespace std;  
    12.   
    13. class MinStack {  
    14. public:  
    15.     struct StackNode{  
    16.         int num;  
    17.         int min;  
    18.     };  
    19.     vector<StackNode> stack;  
    20.     void push(int x) {  
    21.         if (stack.empty()) {  
    22.             StackNode S = {x,x};  
    23.             stack.push_back(S);  
    24.         }else{  
    25.             if (x < stack.back().min) {  
    26.                 StackNode S = {x,x};  
    27.                 stack.push_back(S);  
    28.             }else{  
    29.                 StackNode S = {x,stack.back().min};  
    30.                 stack.push_back(S);  
    31.             }  
    32.         }  
    33.           
    34.     }  
    35.       
    36.     void pop() {  
    37.         if (stack.empty()) {  
    38.               
    39.         }else{  
    40.             stack.pop_back();  
    41.         }  
    42.     }  
    43.       
    44.     int top() {  
    45.         if (stack.empty()) {  
    46.             return NULL;  
    47.         }  
    48.         return stack.back().num;  
    49.     }  
    50.       
    51.     int getMin() {  
    52.         if (stack.empty()) {  
    53.             return NULL;  
    54.         }  
    55.         return stack.back().min;  
    56.     }  
    57. };  
    58.   
    59. int main(int argc, const char * argv[]) {  
    60.     MinStack minstack;  
    61.     minstack.push(-1);  
    62.     minstack.push(1);  
    63.     printf("%d %d\n",minstack.top(), minstack.getMin());  
    64.     return 0;  

算法学习 - 最小栈的实现O(1)时间