先来看问题:
设计含最小函数min()、pop()、push()的栈AntMinStack 要求: 1.AntMinStack实现测试,满足栈特性 2.要求min、push、pop、的时间复杂度都是O(1)
首先,我们分析下该题考点:
1、实现测试:需写出测试用例;2、满足栈的特性:栈有几大特性,空间连续,后进先出,线程私有等等,很明显,该处考验的是后进先出;3、时间复杂度都是O(1),说明不管如何改变,花费时间一致;
接下来我们看实现代码:
package com.cookie;import java.util.Random;import java.util.Stack;/** * author : cxq * Date : 2019/8/14 * 栈特点:后进先出 * pop():返回栈顶对象并从栈中移除 * peek():返回栈顶对象 * push():往栈中填充对象 * */public class AntMinStack { Stack stack = new Stack<>(); Stack minStack = new Stack<>(); /** * push 放入元素 * @param data */ public void push(int data) { // 往stack中放入元素 stack.push(data); if (minStack.isEmpty()){ minStack.push(data); }else { Integer min = minStack.peek(); // 始终保持最小元素放最顶端 if (min != null && min > data ){ minStack.push(data); } } } /** * pop 推出元素 * @return * @throws Exception */ public int pop() throws Exception { Integer data = stack.pop(); if (data != null && !minStack.isEmpty() && minStack.peek() != null && minStack.peek() == data ){ minStack.pop(); } return data ; } /** * min 最小函数,调用该函数,可直接返回当前AntMinStack的栈的最小值 * * @return * @throws Exception */ public int min() throws Exception { return minStack.peek() ; } public boolean empty(){ return minStack.isEmpty() ; } public static void main(String[] args) { AntMinStack minStack = new AntMinStack(); Random random = new Random(31); for (int i = 0; i < 10; i++) { int item = random.nextInt(100); minStack.push(item); System.out.println("Push: " + item); boolean flag = random.nextBoolean(); if (flag && !minStack.empty()) { try { int min = minStack.min(); System.out.println("Peek Min: " + min); } catch (Exception e) { System.err.println(); } } } }}
运行main方法,控制台输出如下:
![4434c89d4ea5c8b5c44bb5d98dbc79a1.png](https://img-blog.csdnimg.cn/img_convert/4434c89d4ea5c8b5c44bb5d98dbc79a1.png)