算法2_实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值,时间复杂度都为O(1)(keep it up)

来源:互联网 发布:天金加银软件 编辑:程序博客网 时间:2024/05/17 14:27
实现一个栈,除了push和pop操作,还要实现min函数以返回栈中的最小值。 
push,pop和min函数的时间复杂度都为O(1)。


看到这个题目最直接的反应是用一个变量来保存当前栈的最小值,让我们来看看这样可行否?
如果栈一直push那是没有问题,入栈元素如果比当前最小值还小,那就更新当前最小值。 
可是如果pop掉的栈顶元素就是最小值,那么我们如何更新最小值呢?显然不太好办。 
既然只用一个变量没法解决这个问题,那我们就增加变量。如果说每个结点除了保存当前的 值,
另外再保存一个从该结点到栈底的结点中的最小值。那么,不论哪个结点成为了栈顶结 点,
我们都有办法取得剩下的这些元素的最小值。代价是付出的空间多了一倍。代码不写了。


下面在介绍一种方法,我们可以在用一个栈来保存栈的最小值:
比如有一组数要入栈: 10 11 6 2 12
栈S1: 10 11 6 2 12
栈S2: 10 6 2
即到栈顶12时,最小值是2, 如果S1栈12出,和S2.top比较,如果大于S2.top,则S2不做
任何操作,如果等于S2.top, 则S2.pop(); 比如S1的2出栈时,2 == S2.top(), 然后S2.pop();
这样就节省了很多空间。
但是上述方法还有问题:
比如数据
S1:10 11 6 2 2 2 12 这时
S2:10 11 6 2
当S1中2出栈时,S2中的2也会出栈,这样我们才去S1的最小值时就是6,明显错了。解决方法就是

S2中每个元素添加一个计数器。这样当连续3次2出栈,S2中的2才出栈。


[html] view plain copy
  1. #include <iostream>  
  2. #include <stack>  
  3.   
  4. struct DataCount  
  5. {  
  6.     int data;  
  7.     int count;  
  8.     DataCount(int vData = std::numeric_limits<int>::infinity()) : data(vData), count(0) {}  
  9. };  
  10.   
  11. class Stack  
  12. {  
  13. public:  
  14.     Stack() {}  
  15.     ~Stack() {}  
  16.   
  17.     void push(int vData)  
  18.     {  
  19.         m_Data.push(vData);  
  20.         if (m_MinData.empty())   
  21.         {  
  22.             m_MinData.push(DataCount(vData));  
  23.         }  
  24.         else  
  25.         {  
  26.             if (vData < m_MinData.top().data)  
  27.             {  
  28.                 m_MinData.push(DataCount(vData));  
  29.             }  
  30.             else if (vData == m_MinData.top().data)  
  31.             {  
  32.                 ++m_MinData.top().count;  
  33.             }  
  34.         }  
  35.     }  
  36.   
  37.     void pop()  
  38.     {  
  39.         if (m_Data.empty())   
  40.         {  
  41.             std::cout << "Empty stack\n";  
  42.             return;  
  43.         }  
  44.   
  45.         int Data = m_Data.top();  
  46.         m_Data.pop();  
  47.   
  48.         if (Data == m_MinData.top().data)  
  49.         {  
  50.             if (--m_MinData.top().count == 0)  
  51.             {  
  52.                 m_MinData.pop();  
  53.             }  
  54.         }  
  55.     }  
  56.   
  57.     int getMin()  
  58.     {  
  59.         if (m_MinData.empty())  
  60.         {  
  61.             std::cout << "Empty stack\n";  
  62.             return;  
  63.         }  
  64.         return m_MinData.top().data;  
  65.     }  
  66.   
  67. private:  
  68.     std::stack<int>        m_Data;  
  69.     std::stack<DataCount>  m_MinData;  
  70. };  


原文来自:http://blog.csdn.net/xiaoliangsky/article/details/38762113?utm_source=tuicool&utm_medium=referral

0 0