1 题目:
实现一个栈, 该栈带有出栈(pop), 入栈(push), 取最小元素(getMin)3个方法. 并且要保证3个方法的时间复杂度都是O(1)
2 思路:
1.创建两个栈, 栈A和备胎栈B, 并且我们的目标是让所有的最小元素全部存放在栈B.<br /> 2.第一个元素进入栈A, 此时只有一个元素, 最小元素就是第一个元素, 所以, 让新元素也进入栈B.
3.每当有新元素进入栈A, 则新元素和A的最小值进行比较, 即和栈B的栈顶元素比较, 如果小于B的栈 顶元素, 则让其进行栈B.那么此时栈B的栈顶元素就是栈A的最小元素值
(3) 时间复杂度: 进栈, 出栈, 取最小值的时间复杂度都是O(1)
3.代码
package com.xiaoxuanfeng.arithmetic;import java.util.Stack;// 最小栈的实现public class TheRealizationOfSmallestStack {// 1.创建两个栈, 一个主栈 mainStack, 一个辅肋栈minStackStack<Integer> mainStack = new Stack<>();Stack<Integer> minStack = new Stack<>();// 2.入栈方法public void push(int element) {mainStack.push(element);// 如果minStack 为空, 或者element <= minStack.peek()if (minStack.isEmpty() || element <= minStack.peek()) {minStack.push(element);}}// 3.出栈方法public void pop() {// 如果主栈当前的栈顶元素 == 辅助的栈顶元素,if (mainStack.peek() == minStack.peek()) {minStack.pop();}mainStack.pop();}// 4.取最小值方法public int getMin() throws Exception {// 首先判断主栈是否为空if (mainStack.isEmpty()) {throw new Exception("mainStack is empty");}return minStack.peek();}// 5.测试public static void main(String[] args) throws Exception {// 创建最小栈TheRealizationOfSmallestStack minStack = new TheRealizationOfSmallestStack();minStack.push(8);minStack.push(2);minStack.push(3);minStack.pop();// 打印结果System.out.println("最小栈的目前最小值是:" + minStack.getMin());}}
