zoukankan      html  css  js  c++  java
  • 包含min函数的栈

    来源:牛客网、《剑指offer》

    定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求push pop min 操作的复杂度为O(1)。

    考虑使用两个栈,一个数据栈,等同于普通的栈,实现push pop peek 等操作;另一个辅助栈实现min函数。

    这题关键在于用辅助栈储存什么值。要保证辅助栈的top是最小值,pop之后的顶部仍然是最小值。也就是说辅助栈从上到下存储的应该是最小值->次小值->次次小值……

    这里容易进入一个误区就是:难道辅助栈就是对数据栈的排序?如果真是这样,push的时候因为要排序不能满足O(1);数据栈pop的时候,辅助栈要先查找数据栈pop出去的值然后再pop,也不满足O(1)。

    当两个栈为空时,push进去的第一个值即为最小值;

    push第二个元素时,若push的值<辅助栈顶元素(此处即第一个值),则将此值压进辅助栈;若push的值大于等于辅助栈顶元素,则将辅助栈顶元素再次push进去。

    pop的时候,数据栈辅助栈均弹出顶元素。

    java code:

     1 import java.util.Stack;
     2 
     3 public class TT {
     4     Stack<Integer> stack1 = new Stack<Integer>(); // 数据栈
     5     Stack<Integer> stack2 = new Stack<Integer>(); // 辅助栈 用于返回min值
     6 
     7 
     8     public void push(int node) {
     9         stack1.push(node);
    10         if (stack2.empty()) {
    11             stack2.push(node);
    12         } else {
    13             if (node < stack2.peek().intValue())
    14                 stack2.push(node);
    15             else stack2.push(stack2.peek());
    16         }
    17 
    18     }
    19 
    20     public void pop() {
    21         if (!stack1.empty())
    22             stack1.pop();
    23         if (!stack2.empty())
    24             stack2.pop();
    25     }
    26 
    27     public int top() {
    28         if (!stack1.empty())
    29             return stack1.peek().intValue();
    30         else return 0;
    31     }
    32 
    33     public int min() {
    34         if (!stack2.empty())
    35             return stack2.peek().intValue();
    36         else return 0;
    37     }
    38 }

    参考资料:《剑指offer》

  • 相关阅读:
    力扣算法题—048旋转图像
    力扣算法题—047全排列2
    力扣算法题—046全排列
    力扣算法题—045跳跃游戏二
    数据结构【排序】—排序算法大集合
    数据结构【查找】—B树
    第一百四十四天 how can I 坚持
    第一百四十一/二/三天 how can I 坚持
    第一百四十天 how can I坚持
    第一百三十九天 how can I 坚持
  • 原文地址:https://www.cnblogs.com/duanguyuan/p/5693706.html
Copyright © 2011-2022 走看看