设计包含min函数的栈



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

源码:

// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h”
#include<assert.h>
#include<iomanip>
#include <vector>
#include<iostream>
using namespace std;

template<typename T>
class MinClass
{
public:
 MinClass()
 {
  
 }

  T  Min();
  T Pop();
  void Push(T );

public:
 vector<T> vec;
 vector<int> minIndex;
};

template<typename T> T MinClass<T>::Min()
{
  assert(minIndex.size() > 0);
  assert(vec.size() > 0);

  return vec[minIndex.back()];
}

template<typename T> T MinClass<T>::Pop()
 {
  assert(vec.size() > 0);

  minIndex.pop_back();

  int m = vec.back();
  vec.pop_back();
  return m;
 }

template<typename T> void  MinClass<T>::Push(T data)
 {
  if (vec.size()==0)
  {
   vec.push_back(data);
   minIndex.push_back(0);
  }
  else
  {
   if (data>(int)(vec[minIndex[minIndex.back()]]))
   {
    minIndex.push_back(minIndex[minIndex.size() – 1]);
   }
   else
   {
    minIndex.push_back(minIndex.size());
   }
   vec.push_back(data);
  }

 }

 void PrintList(MinClass<int> M)
 {
  for (int i = 0; i < M.vec.size(); i++)
  {
   cout<<setw(2) << M.vec[i] << ”  “;
  }
 }

int main(void)
{
 MinClass<int> MinTemp;

 while (true)
 {
  int m;
  cout << “请输入命令(1:min,2:pop,3:push):” << endl;
  cin >> m;
  switch (m)
  {
   case 1:
   {
       int data = MinTemp.Min();
       cout << endl << “最小值为 ” << data << endl;
       PrintList(MinTemp);
       cout << endl;
       break;
   }

   case 2: //PoP
   {
      int data = MinTemp.Pop();
      cout << endl << “POP为 ” << data << endl;
      PrintList(MinTemp);
      cout << endl;
      break;
   }

   case 3: //Push
   {
      int data;
      cout << “请输入数值:” << endl;
      cin >> data;
      MinTemp.Push(data);
      cout << endl << “Push后 ” << endl;
      PrintList(MinTemp);
      cout << endl;
      break;
   }

   default:
    break;
  }

 }

 return 0;
}


点赞