数据结构算法面试题:请实现一个栈,在栈中支持取出最小值的操作。

该文章提供了一种实现数据结构——栈的方法,这个栈在支持常规的入栈、出栈、获取栈顶元素操作的同时,还能在常数时间内获取栈中的最小值。代码分别使用C++和Java编写,通过维护一个额外的最小值栈来记录当前栈中的最小元素。
摘要由CSDN通过智能技术生成

数据结构算法面试题:请实现一个栈,在栈中支持取出最小值的操作。

题目:请实现一个栈,在栈中支持取出最小值的操作。

  • C++
#include <iostream>

const int MAX_LEN = 1000;   // 定义一个最大长度常量,表示模拟栈的最大容量

class MinStack {
public:
    MinStack() : m_top(-1) {}    // 构造函数,初始化数据栈顶指针为 -1,表示当前栈为空栈

    void push(int x) {  // 入栈操作
        if (m_top == MAX_LEN - 1) { // 如果数据栈满了,直接返回
            std::cout << "Stack overflow" << std::endl;
            return;
        }

        m_data[++m_top] = x;    // 在数据栈中插入元素
        if (m_minTop == -1 || x <= m_minData[m_minTop]) {   // 如果最小值栈为空或者新插入的元素比最小值栈中的元素还要小
            m_minData[++m_minTop] = x;  // 将新元素加入到最小值栈的栈顶
        }
    }

    void pop() {    // 出栈操作
        if (m_top == -1) {  // 如果数据栈为空,直接返回
            std::cout << "Stack is empty" << std::endl;
            return;
        }

        if (m_data[m_top] == m_minData[m_minTop]) {    // 如果数据栈的栈顶元素等于最小值栈的栈顶元素
            --m_minTop; // 最小值栈也出栈,维护最小值的状态
        }
        --m_top;    // 数据栈出栈
    }

    int top() { // 获取数据栈的栈顶元素,即最后入栈的元素
        if (m_top == -1) {  // 如果数据栈为空,返回默认的 -1 值
            std::cout << "Stack is empty" << std::endl;
            return -1;  // 返回默认值
        }

        return m_data[m_top];
    }

    int getMin() {  // 获取当前时刻的最小值(即最小值栈的栈顶元素)
        if (m_minTop == -1) {   // 如果最小值栈为空,返回默认的 -1 值
            std::cout << "Stack is empty" << std::endl;
            return -1;  // 返回默认值
        }

        return m_minData[m_minTop];
    }

private:
    int m_data[MAX_LEN];    // 模拟数据栈,用于存储所有元素
    int m_minData[MAX_LEN]; // 存储当前时刻的最小值
    int m_top;              // 数据栈顶指针,指向最后一个入栈的元素
    int m_minTop;           // 最小值栈顶指针,指向当前时刻的最小值
};

int main() {
    MinStack stack; // 声明并初始化了一个 MinStack 类的实例对象
   
    stack.push(5);  // 元素 5 入栈
    stack.push(2);  // 元素 2 入栈
    stack.push(7);  // 元素 7 入栈

    std::cout << "Min element: " << stack.getMin() << std::endl;    // 获取最小元素
    stack.pop();    // 出栈操作
    std::cout << "Top element: " << stack.top() << std::endl;    // 获取数据栈的栈顶元素(即最后入栈的元素)
    std::cout << "Min element: " << stack.getMin() << std::endl;    // 再次获取最小元素

    return 0;
}


  • Java
import java.util.Arrays;

class MinStack {
    private int[] m_data;       // 模拟数据栈,用于存储所有元素
    private int[] m_minData;    // 存储当前时刻的最小值
    private int m_top;          // 数据栈顶指针,指向最后一个入栈的元素
    private int m_minTop;       // 最小值栈顶指针,指向当前时刻的最小值

    public MinStack() {
        m_data = new int[1000];
        m_minData = new int[1000];
        Arrays.fill(m_minData, Integer.MAX_VALUE);  // 将最小值栈中的元素全部设置为最大值,确保新插入的元素一定比当前的最小值小
        m_top = -1;         // 构造函数,初始化数据栈顶指针为 -1,表示当前栈为空栈
        m_minTop = -1;      // 最小值栈顶指针置为 -1
    }

    public void push(int x) {   // 入栈操作
        if (m_top == 999) {     // 如果数据栈满了,直接返回
            System.out.println("Stack overflow");
            return;
        }

        m_data[++m_top] = x;    // 在数据栈中插入元素
        if (x <= m_minData[m_minTop]) { // 如果新插入的元素比最小值栈的栈顶元素还要小
            m_minData[++m_minTop] = x;  // 将新元素加入到最小值栈中
        }
    }

    public void pop() {     // 出栈操作
        if (m_top == -1) {  // 如果数据栈为空,直接返回
            System.out.println("Stack is empty");
            return;
        }

        if (m_data[m_top] == m_minData[m_minTop]) {    // 如果数据栈的栈顶元素等于最小值栈的栈顶元素
            --m_minTop; // 最小值栈也出栈,维护最小值的状态
        }
        --m_top;    // 数据栈出栈
    }

    public int top() {      // 获取数据栈的栈顶元素,即最后入栈的元素
        if (m_top == -1) {  // 如果数据栈为空,返回默认的 -1 值
            System.out.println("Stack is empty");
            return -1;  // 返回默认值
        }

        return m_data[m_top];
    }

    public int getMin() {   // 获取当前时刻的最小值(即最小值栈的栈顶元素)
        if (m_minTop == -1) {   // 如果最小值栈为空,返回默认的 -1 值
            System.out.println("Stack is empty");
            return -1;  // 返回默认值
        }

        return m_minData[m_minTop];
    }

    public static void main(String[] args) {
        MinStack stack = new MinStack();    // 声明并初始化了一个 MinStack 类的实例对象

        stack.push(5);  // 元素 5 入栈
        stack.push(2);  // 元素 2 入栈
        stack.push(7);  // 元素 7 入栈

        System.out.println("Min element: " + stack.getMin()); // 获取最小元素
        stack.pop();    // 出栈操作
        System.out.println("Top element: " + stack.top());   // 获取数据栈的栈顶元素(即最后入栈的元素)
        System.out.println("Min element: " + stack.getMin()); // 再次获取最小元素
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客李华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值