zoukankan      html  css  js  c++  java
  • MS

    定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。 要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。 

      1 template<typename T>
      2 struct MinStackElement
      3 {
      4     T data;
      5     T min;
      6 };
      7 
      8 template<typename T>
      9 struct MinStack
     10 {
     11     MinStack() : pData(NULL), size(0), top(0){}
     12     MinStackElement<T>* pData;
     13     int size;
     14     int top;
     15 };
     16 
     17 template<typename T>
     18 void MinStackInitialize(MinStack<T>& s, int maxSize)
     19 {
     20     MinStackFree(s);
     21      s.pData = (MinStackElement<T>*)malloc(maxSize*sizeof(MinStackElement<T>));
     22      memset(s.pData, 0, maxSize*sizeof(MinStackElement<T>));
     23      s.size = maxSize;
     24      s.top = 0;
     25  }
     26 
     27  template<typename T>
     28  void MinStackFree(MinStack<T>& s)
     29  {
     30      if (s.pData)
     31      {
     32          free(s.pData);
     33          s.pData = nullptr;
     34      }
     35 
     36      s.size = 0;
     37      s.top = 0;
     38  }
     39 
     40  template<typename T>
     41  void MinStackPush(MinStack<T>& s, T data)
     42  {
     43      if (s.size == 0)
     44      {
     45          printf("Stack is not initialized.
    ");
     46          return;
     47      }
     48 
     49      if (s.top == s.size)
     50      {
     51          printf("Stack is full.
    ");
     52          return;
     53      }
     54 
     55      s.pData[s.top].data = data;
     56      s.pData[s.top].min = (s.top == 0 ? data : s.pData[s.top - 1].min);
     57      if (s.pData[s.top].min > data)
     58      {
     59          s.pData[s.top].min = data;
     60      }
     61 
     62      wcout << L"stack push " << data << endl;
     63      s.top++;
     64  }
     65 
     66  template<typename T>
     67  T MinStackPop(MinStack<T>& s)
     68  {
     69     if (s.top == 0)
     70     {
     71         printf("Stack is empty.
    ");
     72         return -1;
     73     }
     74 
     75     T data = s.pData[--s.top].data;
     76     wcout << L"stack pop " << data << endl;
     77 
     78     return data;
     79  }
     80 
     81 template<typename T>
     82 T MinStackGetMin(const MinStack<T>& s)
     83 {
     84     if (s.top == 0)
     85     {
     86         printf("Stack is empty.
    ");
     87         return 0;
     88     }
     89 
     90     T min = s.pData[s.top - 1].min;
     91     printf("Min :%d
    ", min);
     92 
     93     return min;
     94 }
     95 
     96 int _tmain(int argc, _TCHAR* argv[])
     97 {
     98     int min = 0;
     99     MinStack<int> s;
    100 
    101     MinStackPush(s, 9);
    102 
    103     MinStackInitialize(s, 10);
    104     MinStackPush(s, 9);
    105     MinStackPush(s, 5);
    106     MinStackPush(s, 6);
    107     MinStackPush(s, 4);
    108     MinStackPop(s);
    109     MinStackGetMin(s);
    110     MinStackPush(s, 3);
    111     MinStackPush(s, 8);
    112     MinStackPush(s, 2);
    113 
    114     MinStackPop(s);
    115 
    116     MinStackPush(s, 7);
    117     MinStackPush(s, 1);
    118 
    119     MinStackGetMin(s);
    120 
    121     MinStackPop(s);
    122     MinStackGetMin(s);
    123     MinStackPop(s);
    124     MinStackGetMin(s);
    125     MinStackPop(s);
    126     MinStackGetMin(s);
    127     MinStackPop(s);
    128     MinStackGetMin(s);
    129     MinStackPop(s);
    130     MinStackGetMin(s);
    131     MinStackPop(s);
    132     MinStackPop(s);
    133     MinStackPop(s);
    134     MinStackGetMin(s);
    135 
    136     MinStackFree(s);
    137 
    138     return 0;
    139 }

    >test.exe
    Stack is not initialized.
    stack push 9
    stack push 5
    stack push 6
    stack push 4
    stack pop 4
    Min :5
    stack push 3
    stack push 8
    stack push 2
    stack pop 2
    stack push 7
    stack push 1
    Min :1
    stack pop 1
    Min :3
    stack pop 7
    Min :3
    stack pop 8
    Min :3
    stack pop 3
    Min :5
    stack pop 6
    Min :5
    stack pop 5
    stack pop 9
    Stack is empty.
    Stack is empty.

  • 相关阅读:
    SparkSql初级编程实践
    云时代架构之苏宁安全架构演进及实践
    云时代架构之知乎网站架构变迁史
    质量属性的六个常见属性场景之《淘宝网》
    云时代架构之游戏服务器的架构演进
    《架构漫谈阅读心得》
    转换后缀表达式
    约瑟夫环(改进3.0)
    栈结构之后缀表达式
    约瑟夫环(改进2.0)
  • 原文地址:https://www.cnblogs.com/kernel0815/p/5633185.html
Copyright © 2011-2022 走看看