概述
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net
package live.every.day.ProgrammingDesign.CodingInterviewGuide.StackAndQueue;
import java.util.Stack;
/**
* 设计一个有getMin功能的栈
*
* 【题目】
* 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。
*
* 【要求】
* 1、push、pop、getMin操作的时间复杂度都是O(1)。
* 2、设计的栈类型可以使用现成的栈结构。
*
* 【难度】
* 简单
*
* 【解答】
* 在设计上我们使用两个栈,一个栈用来保存当前栈中的元素,其功能和一个正常的栈没有区别,记为dataStack;另一个栈用于保存
* 每一步的最小值,记为minStack。具体的实现方式有两种。
*
* 第二种设计方案如下。
*
* 压入数据规则:
* 假设当前数据为num,先将其压入dataStack。然后判断minStack是否为空:
* 如果为空,则num也压入minStack;
* 如果不为空,则比较num和minStack的栈顶元素中哪一个更小:如果num更小或两者相等,则num也压入minStack;如果minStack中
* 栈顶元素小,则把minStack的栈顶元素重复压入minStack,即在栈顶元素上再压入一个栈顶元素。
*
* 弹出数据规则:
* 在dataStack中弹出数据,弹出的数据记为value;弹出minStack中的栈顶;返回value。
* 很明显可以看出,压入与弹出规则是对应的。
*
* 查询当前栈中的最小值:
* 由上文的压入数据规则和弹出数据规则可知,minStack始终记录着dataStack中的最小值,所以minStack的栈顶元素始终是当前
* dataStack中的最小值。
*
* 方案二的代码实现如StackWithGetMin2类所示:
*
* 【点评】
* 方案一和方案二其实都是用minStack栈保存着dataStack每一步的最小值。共同点是所有操作的时间复杂度都为O(1)、空间复杂度
* 都为O(n)。区别是:方案一中minStack压入时稍省空间,但是弹出操作稍费时间;方案二中minStack压入时稍费空间,但是弹出操
* 作稍省时间。
*
* @author Created by LiveEveryDay
*/
public class StackWithGetMin2 {
private final Stack<Integer> dataStack;
private final Stack<Integer> minStack;
public StackWithGetMin2() {
this.dataStack = new Stack<>();
this.minStack = new Stack<>();
}
public void push(int num) {
this.dataStack.push(num);
if (this.minStack.isEmpty()) {
this.minStack.push(num);
} else if (num < this.getMin()) {
this.minStack.push(num);
} else {
int min = this.minStack.peek();
this.minStack.push(min);
}
}
public int pop() {
if (this.dataStack.isEmpty()) {
throw new RuntimeException("Stack is empty.");
}
this.minStack.pop();
return this.dataStack.pop();
}
public int getMin() {
if (this.minStack.isEmpty()) {
throw new RuntimeException("Stack is empty.");
}
return this.minStack.peek();
}
public static void main(String[] args) {
StackWithGetMin2 stack = new StackWithGetMin2();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(2);
stack.pop();
System.out.printf("The min element in stack is: %d%n", stack.getMin());
}
}
// ------ Output ------
/*
The min element in stack is: 1
*/
最后
以上就是大气书包为你收集整理的设计一个有getMin功能的栈-Java:解法二的全部内容,希望文章能够帮你解决设计一个有getMin功能的栈-Java:解法二所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复