设计一个有getMin功能的栈
【题目】
实现一个特殊的栈,在实现栈的基本功能的基础上,在实现返回栈中最小元素的操作。
【要求】
1.pop、push、getMin操作的时间复杂度都是O(1)。
2.设计的栈的类型可以使用现成的栈结构
【思路一】
-
在类中声明两个原始栈stackData和stackMin用来存储输入数据和较小值数据。
-
当压入数据时,先检测stackMin是否为空,若为空则将数据压入两栈;若不为空则比较输入数据与stackMin栈顶数据的大小,若小于等于栈顶元素则压入两栈,否则只压入stackData栈。
-
当弹出数据时,检测栈中是否还有元素,若无,则抛出异常;若有,则比较stackData栈中弹出元素是否与stackMin栈顶元素相同,若相同则弹出两栈栈顶元素,若不相同则不只需要弹出stackData栈顶元素。
package com.javaman.chap1; import java.util.Stack; public class Mystack1 { private Stack<Integer> stackData; private Stack<Integer> stackMin; public Mystack1(){ this.stackData = new Stack<>(); this.stackMin = new Stack<>(); } public void push(int newNum){ if(this.stackMin.isEmpty()){ this.stackMin.push(newNum); }else if(newNum <= this.getmin()){ this.stackMin.push(newNum); } this.stackData.push(newNum); } public int pop(){ if(this.stackData.isEmpty()){ throw new RuntimeException("your stack is empty"); } int value = this.stackData.pop(); if(value == this.getmin()){ this.stackMin.pop(); } return value; } public int getmin(){ if(this.stackMin.isEmpty()){ throw new RuntimeException("your stack is empty"); } return this.stackMin.peek(); } public static void main(String[] args) { Mystack1 mystack1 = new Mystack1(); mystack1.push(1); mystack1.push(2); mystack1.push(3); mystack1.pop(); System.out.println("栈的最小值为: " + mystack1.getmin()); } }
【思路二】
-
与【思路一】不同之处在于,当压入stackData中的数据比stackMin站顶数据大时,将stackMin栈顶数据重复压入stackMin中。
-
弹出时操作与stackData弹出操作一致。
public Mystack2(){ this.stackData = new Stack<>(); this.stackMin = new Stack<>(); } public void push(int newNum){ if(this.stackMin.isEmpty()){ this.stackMin.push(newNum); }else if(newNum <= this.getmin()){ this.stackMin.push(newNum); }else{ int newMin = this.stackMin.peek(); this.stackMin.push(newMin); } this.stackData.push(newNum); } public int pop(){ if(this.stackData.isEmpty()){ throw new RuntimeException("your stack is empty"); } this.stackMin.pop(); return this.stackData.pop(); } public int getmin(){ if(this.stackMin.isEmpty()){ throw new RuntimeException("your stack is empty"); } return this.stackMin.peek(); } public static void main(String[] args) { Mystack2 mystack1 = new Mystack2(); mystack1.push(1); mystack1.push(2); mystack1.push(3); mystack1.pop(); System.out.println("栈的最小值为: " + mystack1.getmin()); }}
阅读总结
本题要求查找栈的最小值,考查了栈的压入和弹出条件及操作。细节之处在于栈空判断。
设计到的函数:
- pop() 弹出栈顶元素,并返回值
- push() 压入元素到栈顶
- peek() 获取栈顶元素