题目:实现一个特殊的栈,在实现栈的基本功能的基础上,在实现返回栈中最小元素的操作。
要求:
1. pop push getMin 操作的时间复杂度都是O(1)
2. 设计的栈类型可以使用现成的栈结构
思路:
准备两个栈,一个为stackData(正常存取数据),一个为stackMin(用来存放小于栈顶元素的值)。
压栈:
stackData先压入,然后判断要压栈的数是否小于等于stackMin的栈顶元素,如果是,则stackMin也压入。
弹栈:
stackData先弹出,判断弹出值是否和stackMin的栈顶元素相等,如果是,则stackMin也弹出。
获取最小值:
直接返回stackMin栈顶元素。
public class Stack01 {
private Stack<Integer> stackData;
private Stack<Integer> stackMin;
public Stack01() {
this.stackData = new Stack<>();
this.stackMin = new Stack<>();
}
//压栈操作
public void push(int number) {
if (this.stackMin.isEmpty()) {
this.stackMin.push(number);
}else if (number <= this.getMin()) {
this.stackMin.push(number);
}
this.stackData.push(number);
}
//弹栈操作
public int pop() {
if (this.stackData.isEmpty()) {
throw new RuntimeException("栈为空");
}
int value = stackData.pop();
if (value == this.getMin()) {
this.stackMin.pop();
}
return value;
}
//获取最小值
private int getMin() {
if (this.stackMin.isEmpty()) {
throw new RuntimeException("栈为空");
}
return this.stackMin.peek();
}
public static void main(String[] args) {
Stack01 stack = new Stack01();
stack.push(3);
stack.push(4);
stack.push(5);
stack.push(1);
stack.push(2);
stack.push(1);
System.out.println(stack.getMin());//预期结果 1
stack.pop();
stack.pop();
stack.pop();
System.out.println(stack.getMin());//预期结果 3
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/87983.html