经典指数          
原因
1613
浏览数
0
收藏数
 

设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1) 设计一个栈和一个普通的数组,这个数组的大小和栈的大小一致,数组的每一位记录从栈底到当前为止的最小值,当新插入一个数时,只要比较这个数和之前栈中的最小值,把更小的放入数组中,当出栈时,数组中的值也相应出栈 栈 : 8 3 3 4 8 2 1 4 0 数组: 8 3 3 3 3 2 1 1 0

     举报   纠错  
 
切换
1 个答案

一般定义的栈,若pop和push是O(1),则求最小值时需要遍历栈,则复杂度是O(N);

所以在栈类型实现当中,需要定义一个数组来记录最小值的出现顺序,也就是用空间复杂度换取时间复杂度:

代码的实现如下,主要用到了一个mystack动态数组操作普通的栈;一个 minstack数组栈顶用于记录最小的值:

#include

using namespace std;

#define mystack_empty -1

template

class _mystack{

public:

 _mystack(int c, int i) :capacity(c),_top(i){

  mystack = new T[capacity];

  minstack = new T[capacity];

 }

 ~_mystack()

 {

  delete[] mystack;

  delete[] minstack;

 }

 void push(const T &t)

 {

  if (_top < capacity)

  {

   //入mystack栈

   mystack[_top+1] = t;

   //把比minstack栈顶元素小的指入栈到minstack中,

   //minstack用于记录最小的元素;

   if (_top<0 || minstack[_top]>t)

   {

    minstack[_top+1] = t;

   }

   else

   {

    //minstack的栈顶一直保持最小的值

    minstack[_top + 1] = minstack[_top];

   }

   ++_top;

  }

  //满栈

  else

  {

   cout << "The Stack is Fulled!\n";

  }

 }

 void pop()

 {

  if (_top >= 0)

  {

   _top--;

  }

  else

  {

   cout << "The Stack is Empty!\n";

  }

 }

 T min()

 {

  if (_top >= 0)

  {

   return minstack[_top];

  }

  else

  {

   cout << "The minStack is Empty!\n";

   return mystack_empty;

  }

 }

 T top()

 {

  if (_top >= 0)

  {

   return mystack[_top];

  }

  else

  {

   cout << "The Stack is Empty!\n";

   return mystack_empty;

  }

 }

private:

 int capacity;

 int _top;

 T *mystack;

 T *minstack;

};

int main(void)

{

 _mystack s(1024,-1);

 for (int i = 0; i < 10; ++i)

 {

  s.push(i);

 }

 cout << "top: "<< s.top() << endl;

 s.pop();

 cout << "top: "<< s.top() << endl;

 cout << "min: "<< s.min() << endl;

 return 0;

}

运行结果如下所示:

 
切换
撰写答案