剑指offer面试题21 包含min函数的栈

考察点

java 复制代码
双栈

知识点

题目

分析

题目需要一个能够得到栈的最小元素的min函数,并且min函数,pop,push都要求是O(1)的时间复杂度。遇到栈思维要往双栈上考虑,这种情况一个栈肯定完成不了,需要一个辅助栈,既然要求 O(1)时间内拿到最小元素,那么这个辅助栈的栈顶存的肯定是当前所有元素中最小的元素,所以只要每次入栈的时候取当前元素和辅助栈顶层数据最小值入栈即可。切记注意辅助栈需要和数据栈一起增长,这样当数据栈弹出的时候辅助栈的栈顶数据依然是所有元素中最小的元素

java 复制代码
import java.util.Deque;
import java.util.LinkedList;

public class Stack {
	private Deque stack;
	private Deque minStack;

	public Stack() {
		stack = new LinkedList<>();
		minStack = new LinkedList<>();
	}
	public void push(int val) {
		stack.push(val);
		if (minStack.peek() == null){
			minStack.push(val);
			return;
		}
		int peekData = (int) minStack.peek();
		if (peekData > val) {
			minStack.push(val);
		} else {
			minStack.push(peekData);
		}
	}
	public void pop() {
		if (minStack.peek() == null) {
			throw new Error("stack empty");
		}
		minStack.pop();
		stack.pop();
	}
	public int min() {
		if (minStack.peek() == null) {
			throw new Error("stack empty");
		}
		int peekData = (int) minStack.peek();
		return peekData;
	}
}
public class TwentyOne {
	public static void main(String[] args) {
		Stack stack = new Stack();
		stack.push(3);
		System.out.println(stack.min());
		stack.push(4);
		System.out.println(stack.min());
		stack.push(2);
		System.out.println(stack.min());
		stack.push(1);
		System.out.println(stack.min());
		stack.pop();
		System.out.println(stack.min());
		stack.pop();
		System.out.println(stack.min());
		stack.push(0);
		System.out.println(stack.min());
	}
}
相关推荐
努力也学不会java8 分钟前
【设计模式】抽象工厂模式
java·设计模式·oracle·抽象工厂模式
小刘鸭地下城9 分钟前
深入浅出链表:从基础概念到核心操作全面解析
算法
用户60830892904718 分钟前
集合处理利器,Java中的Stream流API
java·后端
玉衡子19 分钟前
八、MySQL全局优化总结&MySQL8新特性
java·mysql
小刘鸭地下城19 分钟前
哈希表核心精要:从 O(1) 原理到链式地址与开放寻址
算法
9号达人22 分钟前
Java 14 新特性详解与实践
java·后端·面试
ytadpole24 分钟前
揭秘XXL-JOB:Bean、GLUE 与脚本模式的底层奥秘
java·后端
今后12338 分钟前
【数据结构】二叉树的概念
数据结构·二叉树
计算机毕业设计木哥39 分钟前
计算机毕设选题推荐:基于Java+SpringBoot物品租赁管理系统【源码+文档+调试】
java·vue.js·spring boot·mysql·spark·毕业设计·课程设计
青衫客3639 分钟前
Spring异步编程- 浅谈 Reactor 核心操作符
java·spring·响应式编程