程序员面试100题之2

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

解法:用两个vector实现该功能,一个用来存储栈中的实际数据,一个用来存储每次入栈后当时最小的元素的下标。

首先复习一下vector的一些函数

// 定义一个vector

std::vector<int> c;

// 可以使用的功能

c.clear()         移除容器中所有数据。

c.empty()         判断容器是否为空。

c.erase(pos)        删除pos位置的数据

c.erase(beg,end) 删除[beg,end)区间的数据

c.front()         传回第一个数据。

c.back()       传回最后一个数据

c.insert(pos,elem)  在pos位置插入一个elem拷贝

c.pop_back()     删除最后一个数据。

c.push_back(elem) 在尾部加入一个数据。

c.resize(num)     重新设置该容器的大小

c.size()         回容器中实际数据的个数。

c.begin()           返回指向容器第一个元素的迭代器

c.end()             返回指向容器最后一个元素的迭代器

代码如下:

 

  
  
  
  
  1. // minstack.cpp : Defines the entry point for the console application.  
  2. //  
  3.  
  4. #include "stdafx.h"  
  5. #include<iostream>  
  6. //用vector需要包含的头文件  
  7. #include<vector>  
  8. //assert()需要包含的头文件  
  9. #include<assert.h>  
  10. using namespace std;  
  11.  
  12. //注意用模版  
  13. template<class T> class MinStack  
  14. {  
  15.     public:  
  16.         MinStack(){};//注意写构造和析构函数  
  17.         ~MinStack(){};  
  18.         T& top();  
  19.         void push(const T value);  
  20.         void pop();  
  21.         T& min();  
  22.     private:  
  23.         vector<T> stackdata;  
  24.         vector<T> minstackdata;  
  25.  
  26. };  
  27. template<class T> T& MinStack<T>::top()  
  28. {  
  29.     return stackdata.back();  
  30.  
  31. }  
  32. template<class T> void MinStack<T>::push(const T value)  
  33. {  
  34.     stackdata.push_back(value);  
  35.     if(minstackdata.size()==0)  
  36.         minstackdata.push_back(0);  
  37.     else 
  38.     {  
  39.         if(value<stackdata[minstackdata.back()])  
  40.             minstackdata.push_back(stackdata.size()-1);  
  41.         else 
  42.             minstackdata.push_back(minstackdata.back());  
  43.     }  
  44.  
  45. }  
  46. template<class T> void MinStack<T>::pop()  
  47. {  
  48.     //注意assert  
  49.     assert(stackdata.size()>0);  
  50.         assert(minstackdata.size()>0);  
  51.         stackdata.pop_back();  
  52.     minstackdata.pop_back();  
  53.  
  54. }  
  55. template<class T> T& MinStack<T>::min()  
  56. {       assert(stackdata.size()>0);  
  57.         assert(minstackdata.size()>0);  
  58.  
  59.     return stackdata[minstackdata.back()];  
  60. }  
  61. int main(int argc, char* argv[])  
  62. {  
  63.     MinStack<int> a;//注意类模版的类型显示写  
  64.     a.push(3);  
  65.     cout<<a.min()<<endl;  
  66.     a.push(4);  
  67.         cout<<a.min()<<endl;  
  68.     a.push(2);  
  69.         cout<<a.min()<<endl;  
  70.     a.push(1);  
  71.         cout<<a.min()<<endl;  
  72.     cout<<a.top()<<endl;  
  73.     a.pop();  
  74.  
  75.     return 0;  
  76. }  
  77.  

 

你可能感兴趣的:(职场,stack,min,休闲)