ciano

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <assert.h>
  4 #include <vector>
  5 using namespace std;
  6 
  7 template<typename T>
  8 class StackWithStack
  9 {
 10 public:
 11     /// 构造函数
 12     StackWithStack() {}
 13     /// 析构函数
 14     ~StackWithStack() {}
 15 
 16     /// top操作
 17     T &top()
 18     {
 19         return mData.back();
 20     }
 21 
 22     /// top操作
 23     const T &top() const
 24     {
 25         return mData.back();
 26     }
 27 
 28     /// push操作
 29     void push(const T &value)
 30     {
 31         mData.push_back(value);
 32 
 33         /// 这里就将最小的元素下表放入下标数组中
 34         if (mMinIndex.size() == 0)      // 空数组
 35         {
 36             mMinIndex.push_back(0);
 37         }
 38         else
 39         {
 40             /// 使mData的size和mMinIndex的size相等
 41             if (value < mData[mMinIndex.back()])
 42             {
 43                 mMinIndex.push_back(mData.size() - 1);
 44             }
 45             else
 46             {
 47                 mMinIndex.push_back(mMinIndex.back());  // 添加最后一个最小的下标,防止pop的时候删除有效元素
 48             }
 49         }
 50     }
 51 
 52     /// pop操作,把元素弹出,同时把下标也弹出
 53     void pop()
 54     {
 55         mData.pop_back();
 56         mMinIndex.pop_back();
 57     }
 58 
 59     /// 获取最小元素
 60     const T &min() const
 61     {
 62         assert(mData.size() > 0);
 63         assert(mMinIndex.size() > 0);
 64 
 65         return mData[mMinIndex.back()];
 66     }
 67 
 68 
 69 private:
 70     vector<T> mData;
 71     vector<size_t> mMinIndex;
 72 };
 73 
 74 /// 测试
 75 int main()
 76 {
 77     StackWithStack<size_t> stack;
 78     stack.push(3);
 79     printf("%d\n", stack.min());
 80 
 81     stack.push(4);
 82     printf("%d\n", stack.min());
 83 
 84     stack.push(2);
 85     printf("%d\n", stack.min());
 86 
 87     stack.push(1);
 88     printf("%d\n", stack.min());
 89 
 90     stack.pop();
 91     printf("%d\n", stack.min());
 92 
 93     stack.pop();
 94     printf("%d\n", stack.min());
 95 
 96     stack.push(0);
 97     printf("%d\n", stack.min());
 98 
 99 #ifdef _DEBUG
100     system("pause");
101 #endif;
102 
103     return EXIT_SUCCESS;
104 }

 

posted on 2014-09-26 10:20  3th  阅读(121)  评论(0编辑  收藏  举报