• P132、面试题21:包含min函数的栈


    实现思路:们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
     
    测试用例:
    1)功能测试(输入的两个数组含有多个数字或者只有1个数字,第二个数组是或者不是第一个数组表示的压入序列对应的栈的弹出序列);
    2)特殊输入测试(输入两个null指针)

    代码实现:
    栈实现类:
    package com.yyq;
    
    import java.util.Comparator;
    import java.util.EmptyStackException;
    import java.util.Stack;
    
    /**
     * Created by Administrator on 2015/9/16.
     */
    public class StackWithMin<T extends Comparable<T>> {
        private Stack<T> m_data = new Stack<T>();       // 数据栈,存放栈的所有元素
        private Stack<T> m_min = new Stack<T>();        //辅助栈,存放栈的最小元素
    
        public void push(T value){
            // 把新元素添加到辅助栈
            m_data.push(value);
            // 当新元素比之前的最小元素小时,把新元素插入辅助栈里;
            // 否则把之前的最小元素重复插入辅助栈里
            if (m_min.size() == 0){
                m_min.push(value);
            }else{
                if (value.compareTo(m_min.peek()) <= 0){
                    m_min.push(value);
                }else {
                    m_min.push(m_min.peek());
                }
            }
        }
    
        public T min(){
            if (m_min.size() <= 0)
                return null;
            return m_min.peek();
        }
    
        public void pop(){
            if (m_data.size() > 0 && m_min.size() > 0){
                m_data.pop();
                m_min.pop();
            }else{
                throw new EmptyStackException(); // return null
            }
        }
    }

    实现类:

    package com.yyq;
    
    import java.util.ArrayList;
    
    /**
     * Created by Administrator on 2015/9/16.
     */
    public class MinInStack<T> {
        public static void main(String[] args) {
            System.out.println("Test1");
            StackWithMin<Integer> newStack1 = new StackWithMin<Integer>();
            newStack1.push(4);
            newStack1.push(6);
            newStack1.push(2);
            newStack1.push(5);
            newStack1.pop();
            newStack1.pop();
            newStack1.push(1);
            System.out.println(newStack1.min());
    
            System.out.println("Test2");
            StackWithMin<Integer> newStack2 = new StackWithMin<Integer>();
            newStack2.push(3);
            System.out.println(newStack2.min());
    
            System.out.println("Test3");
            StackWithMin<Integer> newStack3 = new StackWithMin<Integer>();
            System.out.println(newStack3.min());
    
            System.out.println("Test4");
            StackWithMin<Integer> newStack4 = new StackWithMin<Integer>();
            newStack4.push(7);
            newStack4.push(6);
            newStack4.push(5);
            System.out.println(newStack4.min());
    
            System.out.println("Test5");
            StackWithMin<Integer> newStack5 = new StackWithMin<Integer>();
            newStack5.push(1);
            newStack5.push(2);
            newStack5.push(3);
            System.out.println(newStack5.min());
    
            System.out.println("Test6");
            StackWithMin<Integer> newStack6 = new StackWithMin<Integer>();
            newStack6.push(1);
            newStack6.push(2);
            newStack6.push(3);
            newStack6.pop();
            newStack6.pop();
            newStack6.pop();
            System.out.println(newStack6.min());
        }
    }
     
    结果输出:
    Test1
    1
    Test2
    3
    Test3
    null
    Test4
    5
    Test5
    1
    Test6
    null
  • 相关阅读:
    c语言,strcat(),字符串拼接
    c语言,strcpy
    [置顶] linux第二天,g++,gcc,ps,cat,sort,grep,kill,less,ls -l ,
    Yuchuan_Linux_C 编程之四动态库(共享库)制作
    Yuchuan_Linux_C 编程之三 静态库的制作和使用
    Yuchuan_Linux_C编程之二 GCC编译
    Yuchuan_Linux_C编程之一 Vim编辑器的使用
    testng学习笔记-- beforesuit和aftersuit
    testng学习笔记-- beforeclass和afterclass
    pom.xml
  • 原文地址:https://www.cnblogs.com/yangyquin/p/4942075.html
Copyright © 2020-2023  润新知