代码随想录算法训练营第十天| Leetcode 232.用栈实现队列、225. 用队列实现栈

本文介绍了如何用栈和队列实现LeetCode中的两个问题,232题用栈模拟队列和225题用队列模拟栈,重点在于pop操作的实现,以及它们的时间和空间复杂度分析。
摘要由CSDN通过智能技术生成

目录

Leetcode 232.用栈实现队列

Leetcode 225. 用队列实现栈


今天的两道题不涉及什么算法,主要是练习栈和队列的操作以及底层原理的简单实现。

Leetcode 232.用栈实现队列

题目链接:Leetcode 232.用栈实现队列

题目描述:使用栈实现队列的下列操作:

  • push(x) -- 将一个元素放入队列的尾部。
  • pop() -- 从队列首部移除元素,并返回移除的元素值。
  • peek() -- 返回队列首部的元素。
  • empty() -- 返回队列是否为空。

思路:这里的四个函数只有pop()和peek()的操作需要注意,但由于二者实现代码类似,因此这里主要介绍pop()。

首先回忆栈和队列的特征:栈是先进后出,队列是先进先出。也就是说,本题要实现的pop需要弹出栈底元素,并将元素值返回。由于栈只有一个出口,所以要用两个栈分别用于输入和输出来模拟队列。如果我们将一个栈的所有元素重新添加到另一个栈中,第二个栈的栈顶元素就是需要弹出的元素。动画演示看这里

以下是完整代码:

class MyQueue {
public:
    //用两个栈模拟队列
    stack<int> stIn;
    stack<int> stOut;
    MyQueue() {}

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

    int pop() {
        if (stOut.empty()) {
            while (!stIn.empty()) {
                //从stInd导入数据
                stOut.push(stIn.top());
                stIn.pop();
            }
        }
        int result = stOut.top();
        stOut.pop();
        return result;
    }

    int peek() {
        int res=this->pop();// 直接使用上面的pop函数
        stOut.push(res);//因为pop将元素弹出,这里再加回去
        return res;
    }

    bool empty() {
        return stIn.empty() && stOut.empty(); 
    }
};
  • 时间复杂度: push和empty为O(1), pop和peek为O(n)
  • 空间复杂度: O(n)

Leetcode 225. 用队列实现栈

题目链接:Leetcode 225. 用队列实现栈

题目描述:使用队列实现栈的下列操作:

  • push(x) -- 元素 x 入栈。
  • pop() -- 移除栈顶元素,并返回移除的元素。
  • top() -- 获取栈顶元素。
  • empty() -- 返回栈是否为空。

思路:主要介绍pop()的实现。根据栈和队列的特点可知:移除栈顶的元素就是移除队列最后一个元素,尽管C++可以直接获取队列尾部元素,但无法移除,队列只能移除首元素。因此我们可以想到:如果把最后一个元素变成首元素不就行了吗?只需要逐一将尾元素前面的元素先出队再重新入队即可。动画演示看这里

以下是完整代码:

class MyStack {
public:
    queue<int> que;
    MyStack() {

    }
    
    void push(int x) {
        que.push(x);
    }
    
    int pop() { 
        int size=que.size()-1;
        while(size--){//除了最后一个元素,剩下的都重新添加到队列尾部
            que.push(que.front());
            que.pop();
        }
        int result=que.front();
        que.pop();
        return result;
    }
    
    int top() {
        return que.back();
    }
    
    bool empty() {
        return que.empty();
    }
};
  • 时间复杂度: pop为O(n),其他为O(1)
  • 空间复杂度: O(n)

总结:今天的两道题帮我重新复习了栈和队列的基本操作,代码基础但是重要。

最后,如果文章有错误,请在评论区或私信指出,让我们共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值