【剑指Offer学习】【面试题21:包括min 函数的栈】
题目: 定义栈的数据结构,请在该类型中实现一个可以得到栈的最小素的min 函数。在该栈中。调用min、push 及pop的时间复杂度都是0(1)
解题思路:
把每次的最小元素(之前的最小元素和新压入战的元素两者的较小值)都保存起来放到另外一个辅助栈里
假设每次都把最小元素压入辅助栈, 那么就能保证辅助栈的栈顶一直都是最小元素.当最小元素从数据栈内被弹出之后,同一时候弹出辅助栈的栈顶元素,此时辅助栈的新栈顶元素就是下一个最小值。
代码实现:
public class Test21 {
    /**
     * 定义栈的数据结构,请在该类型中实现一个可以得到校的最小元素的min函数。
     * 在该栈中。调用pop、push 及min的时间复杂度都是0(1)
     *
     * @param <T> 泛型參数
     */
    public static class StackWithMin<T extends Comparable<T>> {
        // 数据栈,用于存放插入的数据
        private Stack<T> dataStack;
        // 最小数位置栈,存放数据栈中最小的数的位置
        private Stack<Integer> minStack;
        // 构造函数
        public StackWithMin() {
            this.dataStack = new Stack<>();
            this.minStack = new Stack<>();
        }
        /**
         * 出栈方法
         * @return 栈顶元素
         */
        public T pop() {
            // 假设栈已经为空。再出栈抛出异常
            if (dataStack.isEmpty()) {
                throw new RuntimeException("The stack is already empty");
            }
            // 假设有数据。最小数位置栈和数据栈必然是有同样的元素个数,
            // 两个栈同一时候出栈
            minStack.pop();
            return dataStack.pop();
        }
        /**
         * 元素入栈
         * @param t 入栈的元素
         */
        public void push(T t) {
            // 假设入栈的元素为空就抛出异常
            if (t == null) {
                throw new RuntimeException("Element can be null");
            }
            // 假设数据栈是空的,仅仅接将元素入栈,同一时候更新最小数栈中的数据
            if (dataStack.isEmpty()) {
                dataStack.push(t);
                minStack.push(0);
            }
            // 假设数据栈中有数据
            else {
                // 获取数据栈中的最小元素(未插入t之前的)
                T e = dataStack.get(minStack.peek());
                // 将t入栈
                dataStack.push(t);
                // 假设插入的数据比栈中的最小元素小
                if (t.compareTo(e) < 0) {
                    // 将新的最小元素的位置入最小栈
                    minStack.push(dataStack.size() - 1);
                } else {
                    // 插入的元素不比原来的最小元素小,复制最小栈栈顶元素,将其入栈
                    minStack.push(minStack.peek());
                }
            }
        }
        /**
         * 获取栈中的最小元素
         * @return 栈中的最小元素
         */
        public T min() {
            // 假设最小数公位置栈已经为空(数据栈中已经没有数据了),则抛出异常
            if (minStack.isEmpty()) {
                throw new RuntimeException("No element in stack.");
            }
            // 获取数据栈中的最小元素。而且返回结果
            return dataStack.get(minStack.peek());
        }
    }
    public static void main(String[] args) {
        StackWithMin<Integer> stack = new StackWithMin<>();
        stack.push(3);
        System.out.println(stack.min() == 3);
        stack.push(4);
        System.out.println(stack.min() == 3);
        stack.push(2);
        System.out.println(stack.min() == 2);
        stack.push(3);
        System.out.println(stack.min() == 2);
        stack.pop();
        System.out.println(stack.min() == 2);
        stack.pop();
        System.out.println(stack.min() == 3);
        stack.push(0);
        System.out.println(stack.min() == 0);
    }
}执行结果:
【剑指Offer学习】【面试题21:包括min 函数的栈】的更多相关文章
- 《剑指offer》面试题21—包含min函数的栈
		题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min.要求push,min,pop时间都是O(1). 思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素:min函数直 ... 
- 《剑指offer》面试题21 包含min函数的栈 Java版
		(min函数的作用是返回栈内最小值) 首先这个栈要具有普通栈所具有的push()和pop()方法,那么内部一定包含一个Stack.至于还要能实现min函数,而且还是在O(1)时间复杂度内,我们不得不考 ... 
- 《剑指offer》面试题30. 包含min函数的栈
		问题描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1). 示例: MinStack minSt ... 
- 【剑指offer】面试题 21. 调整数组顺序使奇数位于偶数前面
		面试题 21. 调整数组顺序使奇数位于偶数前面 
- 《剑指offer》面试题21. 调整数组顺序使奇数位于偶数前面
		问题描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入:nums = [1,2,3,4] 输出:[1,3,2,4] ... 
- 剑指Offer:面试题21——包含min函数的栈(java实现)
		问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ... 
- (剑指Offer)面试题21:包含min函数的栈
		题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 在该栈中,调用min,push,pop的时间复杂度都是O(1) 思路: 1.除了原来的栈s,增加一个辅助栈s_min,用 ... 
- 剑指offer-面试题21.包含min函数的栈
		题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数. 在该栈中,调用min,push及pop的时间复杂度都是O(1). 这一题实际上需要一个辅助栈存储最小值: 1.在模板类定 ... 
- (剑指Offer)面试题7:用两个栈实现队列
		题目: 用两个栈实现一个队列. 队列的声明如下:请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 思路: 根据栈的“先进后出”特点, ... 
- 剑指offer笔记面试题1----赋值运算符函数
		题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数. class CMyString{ public: CMyString(char* pData = nullptr); CMyS ... 
随机推荐
- 【深度学习系列】PaddlePaddle之数据预处理
			上篇文章讲了卷积神经网络的基本知识,本来这篇文章准备继续深入讲CNN的相关知识和手写CNN,但是有很多同学跟我发邮件或私信问我关于PaddlePaddle如何读取数据.做数据预处理相关的内容.网上看的 ... 
- Oracle-3 - :超级适合初学者的入门级笔记--用户权限,set运算符,高级子查询
			上一篇的内容在这里第二篇内容, 用户权限:创建用户,创建角色,使用grant 和 revoke 语句赋予和回收权限,创建数据库联接 创建用户:create user xxx identified b ... 
- Minix3信号处理分析
			进程的信号处理的相关结构 PM中存放着所有进程的进程描述符,在一个进程描述符中,有一个指针,指向一个sigaction结构二维数组中的一项,表示这个进程所有信号的操作.一个sigaction结构包含信 ... 
- wx:for修改样式
			在获取文字识别数据之后,对数据进行wx:for循环加了边框如图效果: 需求:点击不同边框获取不同文字,再次点击取消选中:选中背景为#999: <view wx:for="{{img_d ... 
- 关于帧动画steps属性的理解
			CSS3的Animation有八个属性 animation-name animation-duration animation-delay animation-iteration-count anim ... 
- Python概述与安装
			Python 一门面向对象的解释性语言. Python优点 开发效率高(有丰富的各种类库,不需要重复造轮子):可移植性:解释性:免费开源:交互式(IDLE,代码写一行执行一行) Python缺点 相对 ... 
- mysql timeout
			(待更新整理) 因为最近遇到一些超时的问题,正好就把所有的timeout参数都理一遍,首先数据库里查一下看有哪些超时: root@localhost : test 12:55:50> show ... 
- Python之matplotlib学习(二)
			例子6.中文标签测试 #!/usr/bin/env python2.7 #-*- coding:utf-8 -*- import matplotlib.pyplot as plt import num ... 
- System.Transactions 事务超时属性
			最近遇到一个处理较多数据的大事务,当进行至10分钟左右时,爆出事务超时异常,如果Machine.config中不设置最大超时时间,则默认超时时间为10分钟 MachineSettingsSection ... 
- javascript 的继承
			我们的JavaScript比较特别了,主要通过原型链实现继承的. 下面介绍各种实现继承的方式:原型链继承,借用构造函数,组合继承,原型式继承,寄生式继承,寄生组合式继承. 二.实现继承方式 1.原型链 ... 
