• 《剑指offer》面试题21—包含min函数的栈


    题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min。要求push,min,pop时间都是O(1)。

    思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素;min函数直接取辅助栈栈顶元素即可;有元素弹出时辅助栈元素也弹出,这样栈顶就是剩下的元素中的最小的了。

     1 #include <iostream>
     2 #include <stack>
     3 using namespace std;
     4 
     5 template<typename T>
     6 class StackWithMin
     7 {
     8 public:
     9     void Push(const T& element);
    10     T Min();
    11     void Pop();
    12 
    13 private:
    14     stack<T> stack_data;
    15     stack<T> stack_min;
    16 };
    17 
    18 template<typename T> void StackWithMin<T>::Push(const T& element)  //类后面的那个T太容易忘了。。
    19 {
    20     if(stack_data.empty())
    21     {
    22         stack_data.push(element);
    23         stack_min.push(element);
    24     }
    25     else
    26     {
    27         stack_data.push(element);
    28         T temp = stack_min.top();
    29         if(element < temp)
    30             stack_min.push(element);
    31         else
    32             stack_min.push(temp);
    33     }
    34 }
    35 
    36 template <typename T> T StackWithMin<T>::Min()
    37 {
    38     if(stack_data.empty())      //这里一开始忘记检查是否为空了!
    39     {
    40         cout<<"Empty Stack!"<<endl;
    41         //return;   这里应该要assert一下
    42     }
    43     return stack_min.top();
    44 }
    45 
    46 template <typename T> void StackWithMin<T>::Pop()
    47 {
    48     if(stack_data.empty())      //这里一开始忘记检查是否为空了!
    49     {
    50         cout<<"Empty Stack!"<<endl;
    51         return;
    52     }
    53     stack_data.pop();
    54     stack_min.pop();
    55 }
    56 
    57 
    58 int main()
    59 {
    60     StackWithMin<int> s;
    61     s.Push(3);
    62     s.Push(3);
    63     s.Push(4);
    64     s.Push(2);
    65     s.Push(1);
    66     cout<<s.Min()<<endl;
    67     s.Pop();
    68     cout<<s.Min()<<endl;
    69     s.Pop();
    70     cout<<s.Min()<<endl;
    71     s.Pop();
    72     cout<<s.Min()<<endl;
    73     s.Pop();
    74     s.Push(0);
    75     cout<<s.Min()<<endl;
    76     s.Pop();
    77     cout<<s.Min()<<endl;
    78     s.Pop();
    79   //  cout<<s.Min()<<endl;
    80     s.Pop();
    81     s.Pop();
    82     return 0;
    83 }
    View Code
  • 相关阅读:
    数据库01
    并发编程6
    并发编程5
    并发编程4
    并发编程3
    并发编程2
    并发编程1
    kali 下文件操作
    kali driftnet
    2017.1.1
  • 原文地址:https://www.cnblogs.com/CnZyy/p/3308492.html
Copyright © 2020-2023  润新知