zoukankan      html  css  js  c++  java
  • 栈和队列问题:设计一个有 getMin 功能的栈

    知识点

      栈是一个先进后出(FILO-First In Last Out)的数据结构,队列是一种先进先出(FIFO-First In First Out)的数据结构。

    题目

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

    要求

    1. pop、push、getMin 操作的时间复杂度都是 O(1)。
    2. 设计的栈类型可以使用现成的栈结构。

    难度

      一星

    解答

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

    • 压入数据规则(push)

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

      1). 如果为空, 则 newNum 也压入 stackMin。

      2). 如果不为空,则比较 newNum 和 stackMin 的栈顶元素哪一个更小:如果 newNum 更小或两者相等,则 newNum 也压入 stackMin; 如果 stackMin 的栈顶元素更小,则 stackMin 不压入任何内容。这样处理的结果,则是 stackMin 的栈顶元素一定为 stackMin 中的最小值。

    • 弹出数据规则(pop)

      先在 stackData 中弹出栈顶元素,记为 value。然后比较当前 stackMin 的栈顶元素和 value, 从上面压入数据规则知道,stackMin 的栈顶元素一定为 stackMin 中的最小值,所以value 一定大于等于 stackMin 栈顶元素。当 value 等于 stackMin 的栈顶元素时,stackMin 弹出栈顶元素;当 value  大于 stackMin 的栈顶元素, stackMin 不弹出任何元素。结果返回 value。

    • 查询当前栈中的最小值(getMin)

      根据上述压入规则可知,该结果应该返回 stackMin 的栈顶元素.

      具体实现见如下代码:

     1 import java.util.Stack;
     2 
     3 public class MyStack {
     4     
     5     private Stack<Integer> stackData;
     6     private Stack<Integer> stackMin;
     7     
     8     //压入数据
     9     public void push(int newNum){
    10         stackData.push(newNum);
    11         if(stackMin.isEmpty()){
    12             stackMin.push(newNum);
    13         }else{
    14             int minValue = stackMin.peek();
    15             if(newNum <= minValue){
    16                 stackMin.push(newNum);
    17             }
    18         }
    19     }
    20     
    21     //弹出数据
    22     public int pop(){
    23         if(stackData.isEmpty()){//栈为空则抛出异常
    24             throw new RuntimeException("该栈不存在任何元素!");
    25         }
    26         
    27         int value = stackData.pop();
    28         int minValue = stackMin.peek();
    29         if(value == minValue){
    30             stackMin.pop();
    31         }
    32         
    33         return value;
    34     }
    35     
    36     //查询最小元素
    37     public int getMin(){
    38         if(stackMin.isEmpty()){//栈为空则抛出异常
    39             throw new RuntimeException("该栈不存在任何元素!");
    40         }
    41         return stackMin.peek(); //peek 方法可以返回栈顶元素, 而不会弹出栈顶元素
    42     }
    43 }
  • 相关阅读:
    如何设置 ComboBox 下拉列表的高度或间距
    winform中ComboBox利用AutoComplete属性实现模糊查询(有缺陷)
    C#中combobox 控件属性、事件、方法
    ComboBox TextUpdate事件
    C#判断页面中的多个文本框输入值是否有重复的实现方法
    c# winfrom程序中 enter键关联button按钮
    WinForm 中ComboBox 绑定总结
    c# 实现ComboBox自动模糊匹配
    C#中ComboBox动态绑定赋值
    WinForm 中 comboBox控件之数据绑定
  • 原文地址:https://www.cnblogs.com/zlxyt/p/10529626.html
Copyright © 2011-2022 走看看