实现一个特殊的栈,是它除了有基本的push()和pop()方法外,再实现一个返回栈中最小元素的方法getMin()。(有图)
package class03; import java.util.Stack; /** * 实现一个特殊的栈,是它除了有基本的push()和pop()方法外,再实现一个返回栈中最小元素的方法getMin(). * (1)push()、pop()、getMin()方法的时间复杂度都是O(1)。 * (2)设计的栈类型,可以使用现成的栈结构。 */ public class Code05_GetMinStack { //自定义栈1 public static class MyStack1 { private Stack<Integer> dataStack;//定义一个数据栈 private Stack<Integer> minStack;//定义一个最小数存放的栈 public MyStack1() { dataStack = new Stack<>(); minStack = new Stack<>(); } public void push(int newNum) { if (minStack.isEmpty()) { minStack.push(newNum); } else if (newNum <= getMin()) {//如果新添加的数,小于等于现在最小栈中的最小值,就把这个新数添加到最小栈中。 minStack.push(newNum); } dataStack.push(newNum);//不管新数和现在的最小栈中的最小值,谁大。都需要把这个新数,添加到数据栈中。 } public int pop() { if (dataStack.isEmpty()) { throw new RuntimeException("your stack is empty!"); } Integer num = dataStack.pop(); if (num == getMin()) { //如果数据栈中弹出的这个数num,等于最小栈中的最小值, //就在弹出数据栈中栈顶的元素时,把最小栈中的最小值也同时弹出。 minStack.pop(); } return num; } //获取自定义栈MyStack1的最小值 public int getMin() { if (minStack.isEmpty()) { throw new RuntimeException("your stack is empty!"); } return minStack.peek(); } } //自定义栈2 public static class MyStack2 { Stack<Integer> dataStack;//数据栈 Stack<Integer> minStack;//最小栈 public MyStack2() { dataStack = new Stack<>(); minStack = new Stack<>(); } public void push(int newNum) { if (minStack.isEmpty()) { minStack.push(newNum); } else if (newNum <= getMin()) {//如果新数<=最小值,就把新数push到最小栈中。 minStack.push(newNum); } else {//如果新数,不小于等于最小值,就把最小栈中的最小值,push到最小栈中。(这个数就是用来占位的) minStack.push(getMin()); } dataStack.push(newNum);//将新数push到数据栈中。 } public int pop() { if (dataStack.isEmpty()) { throw new RuntimeException("your stack is empty!"); } minStack.pop();//最小栈弹出一个数 return dataStack.pop();//数据栈弹出一个数,并返回。 } //获取自定义栈MyStack2的最小值 public int getMin() { if (minStack.isEmpty()) { throw new RuntimeException("your stack is empty!"); } return minStack.peek(); } } public static void main(String[] args) { MyStack1 stack1 = new MyStack1(); stack1.push(3); System.out.println(stack1.getMin()); stack1.push(4); System.out.println(stack1.getMin()); stack1.push(1); System.out.println(stack1.getMin()); System.out.println(stack1.pop()); System.out.println(stack1.getMin()); System.out.println("============="); MyStack2 stack2 = new MyStack2(); stack2.push(3); System.out.println(stack2.getMin()); stack2.push(4); System.out.println(stack2.getMin()); stack2.push(1); System.out.println(stack2.getMin()); System.out.println(stack2.pop()); System.out.println(stack2.getMin()); } }
MyStack1

MyStack2

浙公网安备 33010602011771号