剑指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());
	}
}
相关推荐
FQNmxDG4S1 天前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
超级码力6661 天前
【Latex文件架构】Latex文件架构模板
算法·数学建模·信息可视化
穿条秋裤到处跑1 天前
每日一道leetcode(2026.04.29):二维网格图中探测环
算法·leetcode·职场和发展
Merlos_wind1 天前
HashMap详解
算法·哈希算法·散列表
虹科网络安全1 天前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje1 天前
Java语法进阶
java·开发语言·jvm
汉克老师1 天前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
rKWP8gKv71 天前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫1 天前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287921 天前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日