「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
题目
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
示例:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.min(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.min(); --> 返回 -2.
提示:
- 各函数的调用总次数不超过 20000 次
题目分析
这个题目是对栈的功能进行扩展,实现一个min函数,这个min函数就是取出栈中的最小的数,实现思路呢就是使用两个栈完成这个函数的定义,第一个栈用来存储正常的入栈的数据,第二个栈用来存储比第一个栈小的数据,入栈操作的时候,把数据放入第一个栈中的同时,如果第二个栈是空的或者是比栈中的数据小的话就入栈,出栈的时候,第一个栈的数据出来之后,如果出来的数据第二个栈中也有就也会出栈,保证数据的一致性,
代码实现
//30
class MinStack {
Stack<Integer> stack1,stack2;
/** initialize your data structure here. */
public MinStack() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void push(int x) {
stack1.add(x);
if (stack2.empty()||stack2.peek()>=x) {
stack2.add(x);
}
}
public void pop() {
if (stack1.pop().equals(stack2.peek())) {
stack2.pop();
}
}
public int top() {
return stack1.peek();
}
public int min() {
return stack2.peek();
}
}
这是我用java实现的功能,每个题都用不同的解法和写法,我大体整理了一下自己的思路然后就写了,也没有再想其他的方法,如果你有更好的解法,欢迎和我留言,我们一起进步,一起学习数据结构,共同进步,通过这道题能更熟悉栈的功能和特点。
小知识点
peek()方法是从栈中获取栈顶的数据,检索到的元素不会被删除, 而pop方法是将栈中的栈顶数据弹出并返回栈顶的数据值