栈相关算法题解题思路与代码实现分享

目录

前言

[一、最小栈(LeetCode 155)](#一、最小栈(LeetCode 155))

题目描述

解题思路

代码实现(C++)

代码解释

[二、栈的压入、弹出序列(剑指 Offer JZ31)](#二、栈的压入、弹出序列(剑指 Offer JZ31))

题目描述

解题思路

代码实现(C++)

代码解释

总结


前言

在算法学习和面试准备过程中,栈相关的题目是比较常见的类型。栈作为一种后进先出(LIFO)的数据结构,有着广泛的应用。今天我想分享两道我近期做过的栈相关算法题,以及它们的解题思路和代码实现。

一、最小栈(LeetCode 155)

题目描述

设计一个支持 push , pop , top 操作,并能在常数时间内检索到最小元素的栈。需要实现 MinStack 类,其中包含以下方法:

  • MinStack() 初始化堆栈对象。

  • void push(int val) 将元素 val 推入堆栈。

  • void pop() 删除堆栈顶部的元素。

  • int top() 获取堆栈顶部的元素。

  • int getMin() 获取堆栈中的最小元素。

解题思路

为了在常数时间内获取最小元素,我们可以使用两个栈++。++

++一个普通栈 st 用于存储所有元素,另一个辅助栈 minst 用于存储当前的最小元素。++

每次 push 操作时,如果要压入的元素小于等于 minst 栈顶元素(或者 minst 为空),就同时将该元素压入 minst 栈。

每次 pop 操作时,如果弹出的元素等于 minst 栈顶元素,那么 minst 栈也同时弹出栈顶元素。这样,。

minst 栈顶始终是当前栈中的最小元素。

代码实现(C++)

cpp 复制代码
class MinStack {

public:

    MinStack() {}



    void push(int val) {

        st.push(val);

        if(minst.empty() || val <= minst.top()){

            minst.push(val);

        }

    }



    void pop() {

        if(st.top() == minst.top())

        {

            minst.pop();

        }

        st.pop();

    }



    int top() {

        return st.top();

    }



    int getMin() {

        return minst.top();

    }

private:

    stack<int> st;

    stack<int> minst;

};

代码解释

  1. 构造函数: MinStack() 用于初始化对象,这里不需要额外操作。

  2. push 方法:将元素 val 压入普通栈 st ,然后判断如果 minst 栈为空或者 val 小于等于 minst 栈顶元素,就将 val 也压入 minst 栈。

  3. pop 方法:如果普通栈 st 弹出的元素等于辅助栈 minst 栈顶元素,说明这个元素是当前最小元素,那么 minst 栈也弹出栈顶元素,然后 st 栈弹出元素。

  4. top 方法:直接返回普通栈 st 的栈顶元素。

  5. getMin 方法:直接返回辅助栈 minst 的栈顶元素,即当前栈中的最小元素。

二、栈的压入、弹出序列(剑指 Offer JZ31)

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。

解题思路

1.我们可以使用一个辅助栈,按照压入序列的顺序依次将元素压入辅助栈。

2.每次压入后检查辅助栈栈顶元素是否与弹出序列当前元素相同

3.如果相同则将辅助栈栈顶元素弹出,同时移动弹出序列的指针。

4.不断重复这个过程,直到压入序列遍历完。最后检查辅助栈是否为空,如果为空说明弹出序列是可能的,否则不可能。

代码实现(C++)

cpp 复制代码
cpp

class Solution {

public:

    bool IsPopOrder(vector<int>& pushV, vector<int>& popV)

    {

        stack<int> st;

        int pushi = 0, popi = 0;

        while(pushi < pushV.size())

        {

            st.push(pushV[pushi++]);

            if(st.top()!= popV[popi])

            {

                continue;

            }

            else{

                while(!st.empty() && st.top() == popV[popi])

                {

                    st.pop();

                    popi++;

                }

            }

        }

        return st.empty();

    }

};

代码解释

  1. 首先定义一个辅助栈 st ,以及两个指针 pushi 和 popi 分别指向压入序列和弹出序列的起始位置。

  2. 在 while 循环中,不断将压入序列的元素压入栈中,每次压入后检查栈顶元素是否等于弹出序列当前元素。如果不相等,继续压入下一个元素;如果相等,就进入内层 while 循环,不断弹出栈顶元素,同时移动弹出序列指针,直到栈为空或者栈顶元素不等于弹出序列当前元素。

  3. 最后检查栈是否为空,如果为空,说明所有元素都按照正确顺序弹出,返回 true ;否则返回 false 。

总结

通过这两道栈相关的算法题,我们可以看到栈在解决这类数据顺序相关问题时的巧妙应用。在实际解题过程中,关键是要理解栈的特性,并灵活运用辅助栈等技巧来满足题目要求。希望这些分享能对大家在算法学习和面试准备中有所帮助,也欢迎大家一起交流探讨更优的解题思路。

相关推荐
胖大和尚2 小时前
clang 编译器怎么查看在编译过程中做了哪些优化
c++·clang
钱彬 (Qian Bin)3 小时前
一文掌握Qt Quick数字图像处理项目开发(基于Qt 6.9 C++和QML,代码开源)
c++·开源·qml·qt quick·qt6.9·数字图像处理项目·美观界面
双叶8363 小时前
(C++)学生管理系统(正式版)(map数组的应用)(string应用)(引用)(文件储存的应用)(C++教学)(C++项目)
c语言·开发语言·数据结构·c++
源代码•宸4 小时前
C++高频知识点(二)
开发语言·c++·经验分享
jyan_敬言5 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
liulilittle5 小时前
SNIProxy 轻量级匿名CDN代理架构与实现
开发语言·网络·c++·网关·架构·cdn·通信
tan77º6 小时前
【Linux网络编程】Socket - UDP
linux·服务器·网络·c++·udp
GiraKoo6 小时前
【GiraKoo】C++14的新特性
c++
悠悠小茉莉7 小时前
Win11 安装 Visual Studio(保姆教程 - 更新至2025.07)
c++·ide·vscode·python·visualstudio·visual studio
坏柠7 小时前
C++ Qt 基础教程:信号与槽机制详解及 QPushButton 实战
c++·qt