返回
最小栈——辅助栈&一个栈解法
见解分享
2023-12-24 00:27:06
在日常软件开发中,栈是一种非常实用的数据结构,尤其是在处理函数调用、参数传递和返回值存储等方面。栈的特性是先进后出(FILO),这使得它在许多场景中都非常适用。本文将探讨如何使用辅助栈和一个栈来解决特定的问题,并提供相应的代码示例和操作步骤。
问题描述
假设我们需要实现一个栈,该栈除了具备基本的入栈(push)、出栈(pop)和查看栈顶元素(peek)功能外,还需要支持一种特殊的操作:最小栈。最小栈的特点是每次入栈和出栈时,都需要记录并更新当前栈中的最小元素。
分析原因
要实现一个最小栈,我们需要额外维护一个辅助栈,用于存储当前栈中的最小元素。当新元素入栈时,我们比较新元素与辅助栈顶元素的大小,如果新元素更小,则将其也压入辅助栈;当元素出栈时,我们同时从主栈和辅助栈中移除该元素。
解决方案
方案一:使用两个栈实现最小栈
我们可以使用两个栈来实现这个功能。一个栈用于存储数据,另一个栈用于存储当前栈中的最小元素。
代码示例
import java.util.Stack;
public class MinStack {
private Stack<Integer> dataStack;
private Stack<Integer> minStack;
public MinStack() {
dataStack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
dataStack.push(x);
if (minStack.isEmpty() || x <= minStack.peek()) {
minStack.push(x);
}
}
public void pop() {
if (!dataStack.isEmpty()) {
int value = dataStack.pop();
if (value == minStack.peek()) {
minStack.pop();
}
}
}
public int top() {
if (!dataStack.isEmpty()) {
return dataStack.peek();
}
return -1; // 栈为空时返回-1
}
public int getMin() {
if (!minStack.isEmpty()) {
return minStack.peek();
}
return -1; // 栈为空时返回-1
}
}
操作步骤
- 创建一个
MinStack
对象。 - 调用
push
方法将元素入栈。 - 调用
pop
方法将元素出栈。 - 调用
top
方法查看栈顶元素。 - 调用
getMin
方法查看当前栈中的最小元素。
方案二:使用递归实现最小栈
递归方法可以更简洁地实现最小栈的功能。
代码示例
public class MinStackRecursive {
private Stack<Integer> dataStack;
private Stack<Integer> minStack;
public MinStackRecursive() {
dataStack = new Stack<>();
minStack = new Stack<>();
}
public void push(int x) {
dataStack.push(x);
if (minStack.isEmpty() || x <= minStack.peek()) {
minStack.push(x);
}
}
public void pop() {
if (!dataStack.isEmpty()) {
int value = dataStack.pop();
if (value == minStack.peek()) {
minStack.pop();
}
}
}
public int top() {
if (!dataStack.isEmpty()) {
return dataStack.peek();
}
return -1; // 栈为空时返回-1
}
public int getMin() {
if (!minStack.isEmpty()) {
return minStack.peek();
}
return -1; // 栈为空时返回-1
}
}
操作步骤
- 创建一个
MinStackRecursive
对象。 - 调用
push
方法将元素入栈。 - 调用
pop
方法将元素出栈。 - 调用
top
方法查看栈顶元素。 - 调用
getMin
方法查看当前栈中的最小元素。
相关资源
通过上述两种方案,我们可以灵活地实现一个支持最小操作的栈。希望本文对您有所帮助!