【Leetcode栈与队列 225. 用队列实现栈】C++ 「重要基础」

🎈个人主页:算法诗人
✨收录专栏:算法诗人Leetcode揭秘之旅
🎉欢迎 👍点赞✍评论⭐收藏
🤝希望我的文章能对你们有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗



Leetcode题目链接

225. 用队列实现栈


一、题目描述

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

实现 MyStack 类:

  • void push(int x) 将元素 x 压入栈顶。
  • int pop() 移除并返回栈顶元素。
  • int top() 返回栈顶元素。
  • boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

注意:
你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

示例:

输入:
[“MyStack”, “push”, “push”, “top”, “pop”, “empty”]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 2, 2, false]

解释:
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False

提示:
1 <= x <= 9
最多调用100 次 push、pop、top 和 empty
每次调用 pop 和 top 都保证栈不为空

进阶:你能否仅用一个队列来实现栈。

二、解题思路

在C++中,std::stack和std::queue是标准模板库(STL)中提供的两个常见的容器适配器。以下是它们的一些常用函数:

std::stack

  1. push(const T& val): 将元素推入栈顶。
  2. pop(): 弹出栈顶元素。
  3. top(): 返回栈顶元素的引用。
  4. empty(): 检查栈是否为空。
  5. size(): 返回栈中元素的数量。

std::queue

  1. push(const T& val): 将元素推入队列尾部。
  2. pop(): 弹出队列头部元素。
  3. front(): 返回队列头部元素的引用。
  4. back(): 返回队列尾部元素的引用。
  5. empty(): 检查队列是否为空。
  6. size(): 返回队列中元素的数量。

以下是这道题的思路:

  1. 构造函数:
    构造函数并没有执行具体的操作,只是初始化了两个队列 queue1 和 queue2。
  2. push操作:
    将元素 x 推入队列 queue1,实现了栈的push操作。
  3. pop操作:
    通过使用两个队列,将 queue1 中的元素依次移到 queue2 中,直到 queue1 剩下一个元素。这个剩下的元素即为要弹出的栈顶元素。然后,将 queue2 赋值给 queue1,实现了栈的pop操作。
  4. top操作:
    直接返回 queue1 的队尾元素,即栈顶元素,实现了栈的top操作。
  5. empty操作:
    判断 queue1 是否为空,实现了栈的empty操作。

三、示例代码

class MyStack {
public:
    queue<int> queue1;
    queue<int> queue2;

    MyStack() {

    }
    
    void push(int x) {
        queue1.push(x);

    }
    
    int pop() {
        int size = queue1.size();
        while(size > 1)
        {
            queue2.push(queue1.front());
            queue1.pop();
            size--;
        }
        int result = queue1.front();
        queue1 = queue2;
        while(!queue2.empty())
        {
            queue2.pop();
        }
        return result;
    }
    
    int top() {
        return queue1.back();
    }
    
    bool empty() {
        return queue1.empty();
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

时间复杂度:
push操作:O(1)
pop操作:O(n) (其中n为栈的大小,因为需要将元素从一个队列移到另一个队列)
top操作:O(1)
empty操作:O(1)

空间复杂度:
队列 queue1 和 queue2 一共使用的空间是 O(n),其中 n 为栈的大小。

新手可能不理解的代码(其实是我自己学习到的新知识)

请注意在不同编程语言中pop()函数是否有返回值

善用queue中的back()函数简化问题

结尾碎碎念
“这次的算法解析只是冰山一角,未来我将持续分享更多有趣的算法问题,并提供更深入的解析。如果你对这个系列感兴趣,不要错过即将到来的更新!点赞、关注、收藏,如果有不同的解法欢迎留下你的评论,你们的支持就是我更新的最大动力。让我们一起探索更多算法的奇妙世界,这不仅是为了迎接面试挑战,更是为了成为在编程领域中游刃有余的专家。感谢大家的支持,期待未来更多的相遇和共同成长!”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值