zoukankan      html  css  js  c++  java
  • 设计一个有getMin功能的栈

    【题目】

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

    【要求】​

                1.pop、push、getM​in()操作的时间复杂度都是O(1)。

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

    【解答】​

                在设计上我们使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,这个栈记为stackData;另一个栈用于保存每一步的最小值,这个栈记为stackMin。​

    压人规则:​

    假设当前数据为newNum,先将其压入stackData。然后判断stackMin是否为空:​

            如果为空,则newNum也压入stackMin。​

    ​        如果不为空,则比较newNum和stackMin的栈顶元素哪一个更小:

            如果newNum更小或两者相等,newNum也压入stackMin;​

          ​  如果stackMin中栈顶元素小,则stackMin不压入任何内容。

    弹出规则:​

            ​先在stackData中弹出栈顶元素,记为value。然后比较当前stackMin的栈顶元素和value值哪一个更小。通过压入规则可知,stackMin中存在的元素是从栈底到栈顶逐渐变小的,stack栈顶的元素既是stackMin栈的最小值,也是当前stackData栈的最小值。所以不会出现value比stackMin栈顶元素更小的情况,value只可能大于或者等于stackMin的栈顶元素。

            当value等于stackMin的栈顶元素时,stackMin弹出栈顶元素;当value大于stackMin的栈顶元素时,stackMin不弹出栈顶元素,返回value。

    查询当前栈中的最小值操作​

           stackMin始终记录着stackData中的最小值,所以,stackMin的栈顶元素始终是当前stackData中的最小值。​

    MyStack1.java:

     1 package cn.hl.p1;
     2 
     3 import java.util.Stack;
     4 import org.junit.Test;
     5 
     6 /**
     7  * 设计一个有getMin功能的栈
     8  * 题目:设计一个特殊的栈。在实现栈的基础功能上,再实现返回栈中最小元素的操作
     9  * 要求:
    10  * (1)pop,push,getMin操作的时间复杂度为O(1)
    11  * (2)设计的栈类型可以使用现成的栈结构
    12  * 
    13  * @author 猩生柯北
    14  */
    15 
    16 public class MyStack1 {
    17     private Stack<Integer> stackData;
    18     private Stack<Integer> stackMin;
    19     
    20     public MyStack1(){
    21         this.stackData = new Stack<Integer>();
    22         this.stackMin = new Stack<Integer>();
    23     }
    24     
    25     public void push(int newNum){
    26         if(this.stackMin.isEmpty()){
    27             this.stackMin.push(newNum);
    28         }else if(newNum <= this.getmin()){
    29             this.stackMin.push(newNum);
    30         }
    31         this.stackData.push(newNum);
    32     }
    33     
    34     public int pop(){
    35         if(this.stackData.isEmpty()){
    36             throw new RuntimeException("you stack is empty");
    37         }
    38         int value = this.stackData.pop();
    39         if(value == this.getmin()){
    40             this.stackMin.pop();
    41         }
    42         return value;
    43     }
    44 
    45     public int getmin() {
    46         if(this.stackMin.isEmpty()){
    47             throw new RuntimeException("you stack is empty");
    48         }
    49         return this.stackMin.peek();
    50     } 
    51 }

    Test.java:

    每接触一个新领域,我就像一块掉进水里的海绵,四面八方的养分都让我不断充实。O(∩_∩)O~
  • 相关阅读:
    call()与apply()的作用与区别
    Tomcat8/9的catalina.out中文乱码问题解决
    怎样查看Jenkins的版本
    每日日报2020.8.18
    528. Random Pick with Weight
    875. Koko Eating Bananas
    721. Accounts Merge
    515. Find Largest Value in Each Tree Row
    286. Walls and Gates (Solution 1)
    408. Valid Word Abbreviation
  • 原文地址:https://www.cnblogs.com/zhzcode/p/9574343.html
Copyright © 2011-2022 走看看