当前位置:首页 > 力扣 > 力扣225题:用队列实现栈 - 双队列解法详解

力扣225题:用队列实现栈 - 双队列解法详解

2天前

力扣225题:用队列实现栈 - 双队列解法详解 队列实现栈 力扣225题解 双队列算法 栈数据结构 队列操作技巧 数据结构转换 算法面试题解 LeetCode简单难度题 队列与栈实现 后进先出实现 第1张

内容简介

本文详细解析了力扣225题"用队列实现栈"的双队列解法。通过两个队列的巧妙配合,实现了的后进先出(LIFO)特性。文章包含完整注释代码、算法思路讲解和复杂度分析,帮助读者掌握队列与栈相互转换的核心技巧。


算法思路

‌1.双队列结构‌:使用主队列s1和辅助队列s2

‌2.入栈操作‌:直接压入主队列s1

‌3.出栈操作‌:将主队列s1的前n-1个元素转移到辅助队列s2,弹出最后一个元素

‌4.栈顶元素‌:与出栈操作类似,但保留最后一个元素并重新压回队列

‌5.判空条件‌:主队列s1为空时栈为空


代码实现(带详细注释)

class MyStack {
public:
    queue<int> s1;  // 主队列,存储栈元素
    queue<int> s2;  // 辅助队列,用于操作时的临时存储

    MyStack() {
        // 构造函数,无需特殊初始化
    }
    
    // 入栈操作:直接压入主队列
    void push(int x) {
        s1.push(x);
    }
    
    // 出栈操作:移除并返回栈顶元素
    int pop() {
        // 将主队列前n-1个元素转移到辅助队列
        while (s1.size() > 1) {
            s2.push(s1.front());  // 将s1队首元素压入s2
            s1.pop();             // 弹出s1队首元素
        }
        int res = s1.front();  // 获取最后一个元素(栈顶)
        s1.pop();              // 弹出栈顶元素
        
        // 将辅助队列元素转移回主队列
        while (!s2.empty()) {
            s1.push(s2.front());
            s2.pop();
        }
        return res;  // 返回栈顶元素
    }
    
    // 获取栈顶元素但不移除
    int top() {
        // 将主队列前n-1个元素转移到辅助队列
        while (s1.size() > 1) {
            s2.push(s1.front());
            s1.pop();
        }
        int res = s1.front();  // 获取最后一个元素(栈顶)
        s1.pop();              // 弹出栈顶元素
        s2.push(res);          // 将栈顶元素重新压入辅助队列
        
        // 将辅助队列元素转移回主队列
        while (!s2.empty()) {
            s1.push(s2.front());
            s2.pop();
        }
        return res;  // 返回栈顶元素
    }
    
    // 判断栈是否为空
    bool empty() {
        return s1.empty();  // 主队列为空时栈为空
    }
};

复杂度分析

‌push操作‌:O(1),直接压入主队列

‌pop/top操作‌:O(n),需要转移n-1个元素

‌空间复杂度‌:O(n),需要两个队列存储所有元素


优化方向

‌单队列实现‌:可以仅使用一个队列实现,通过循环队列的方式

‌减少转移次数‌:优化元素转移逻辑

‌异常处理‌:添加对空栈pop/top操作的处理


总结

双队列实现栈是数据结构转换的经典问题,通过主队列和辅助队列的配合,巧妙地用先进先出(FIFO)的队列实现了后进先出(LIFO)的栈特性。理解这种解法有助于掌握队列和栈的核心概念及其相互转换技巧。


参考:力扣225题 解题思路和步骤 C++实现带注释,谭浩强c语言程序设计第五版答案

原创内容 转载请注明出处

分享给朋友:

相关文章

力扣1700题:无法吃午餐的学生数量 - 队列模拟解法详解

力扣1700题:无法吃午餐的学生数量 - 队列模拟解法详解

内容简介本文详细解析了力扣1700题"无法吃午餐的学生数量"的队列模拟解法。通过模拟学生排队取餐的过程,统计无法吃到喜欢三明治的学生数量。文章包含完整注释代码、算法思路讲解和复杂度...

力扣2315题:统计星号的有效数量 - 状态标记解法详解

力扣2315题:统计星号的有效数量 - 状态标记解法详解

内容简介本文详细解析了力扣2315题"统计星号的有效数量"的巧妙解法。通过状态标记法处理字符串中的竖线对,实现了只统计竖线对之外的星号数量的功能。文章包含完整注释代码、算法思路讲解...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。