zoukankan      html  css  js  c++  java
  • "Coding Interview Guide" -- 设计一个有getMin功能的栈

    题目

      实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

    要求

      1. pop、push、getMin操作的时间复杂度都是O(1)

      2. 设计的栈类型可以使用现成的栈结构

    分析

      栈是一种只能在另一端进行操作的具有“先进后出”特性的数据结构,它有push(元素入栈)、pop(元素出栈)、peek(访问栈顶元素)、size(获取栈元素个数)和isEmpty(判断栈是否为空)等基本功能

      一般来说,栈并没有提供返回当前栈中最小元素的方法。因为栈只允许在栈顶对元素进行操作,所以如果只使用一个栈来存储元素,那么我们是无法知道当前栈中的最小元素的,严格地说,对于一个非空栈,我们永远都只知道当前的栈顶元素是什么。所以只用一个栈结构难以实现getMin功能。可以考虑增加一个辅助栈结构,用来记录栈的所有可能最小元素序列。

      

     1 import java.util.Stack;
     2 
     3 public class MyStack
     4 {
     5     private Stack<Integer> dataStack;
     6     private Stack<Integer> minStack;
     7 
     8     public MyStack()
     9     {
    10       dataStack = new Stack<>();
    11       minStack = new Stack<>();
    12     }
    13 
    14     public void push(int data)
    15     {
    16       dataStack.push(data);
    17       if(minStack.empty())    // 辅助栈为空或者栈顶元素小于或等于data时将data入栈,说明将data压入dataStack中后,当前dataStack的最小元素就是data,所以要更新minStack
    18       {
    19         minStack.push(data);
    20       }
    21       else if(data <= minStack.peek())
    22     {
    23             minStack.push(data);
    24       }
    25     }
    26 
    27     public int pop()
    28     {
    29       if(dataStack.empty())
    30       {
    31             throw new RuntimeException("fail to pop, stack is empty.");
    32       }
    33       else
    34       {
    35             int data = dataStack.pop();
    36             if(data == getMin())          // 如果dataStack栈弹出的元素是当前dataStack中的最小元素,则弹出操作之后,需要对minStack栈进行更新
    37             {
    38                 minStack.pop();
    39             }
    40           return data;
    41       }
    42     }
    43     
    44     public int getMin()
    45     {
    46         if(minStack.empty())
    47         {
    48             throw new RuntimeException("fail to getMin, stack is empty.");
    49     }
    50       return minStack.peek();
    51     }
    52 
    53     public int size()
    54     {
    55       return dataStack.size();
    56     }
    57 
    58     public boolean isEmpty()
    59     {
    60         return dataStack.empty();
    61     }
    62 }

    来源:左程云老师《程序源代码面试指南》

      

  • 相关阅读:
    JS中的事件&对象
    WSL使用小结:从ArchLinux到Manjaro
    WSL学习:安装ArchLinux和Root/Cling以及注意事项
    Qt5网络请求使用及WebRequest函数
    有道词典中的OCR功能:第三方库的变化
    C++学习(二):学会使用stringstream
    C语言集锦(三)Direct3D和GDI+的例子
    网络那些事:浏览器、网络协议以及常见软件
    C++学习(一):现代C++尝试
    PostScript学习:另一种缩写为PS的技术
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/10880699.html
Copyright © 2011-2022 走看看