返回

最小栈——辅助栈&一个栈解法

见解分享

在日常软件开发中,栈是一种非常实用的数据结构,尤其是在处理函数调用、参数传递和返回值存储等方面。栈的特性是先进后出(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
    }
}

操作步骤

  1. 创建一个MinStack对象。
  2. 调用push方法将元素入栈。
  3. 调用pop方法将元素出栈。
  4. 调用top方法查看栈顶元素。
  5. 调用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
    }
}

操作步骤

  1. 创建一个MinStackRecursive对象。
  2. 调用push方法将元素入栈。
  3. 调用pop方法将元素出栈。
  4. 调用top方法查看栈顶元素。
  5. 调用getMin方法查看当前栈中的最小元素。

相关资源

通过上述两种方案,我们可以灵活地实现一个支持最小操作的栈。希望本文对您有所帮助!