LeetCode C++ 剑指 Offer 09. 用两个栈实现队列【栈】

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例 1:

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]

示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]

提示:

  • 1 <= values <= 10000
  • 最多会对 appendTail、deleteHead 进行 10000 次调用

题意:使用栈实现队列的队尾插入和队首删除功能。

思路1:做过的题目;使用一个栈,插入时直接进入栈顶;删除时需要把全部元素弹出并插入到临时栈中,此时要删除的元素在临时栈栈顶,删除即可;然后重新插入回原栈中。

代码1:

class CQueue {
public:
    stack<int> st;
    CQueue() {}
    
    void appendTail(int value) {
        st.push(value);
    }
    
    int deleteHead() {
        if (st.empty()) return -1;
        stack<int> temp;
        while (!st.empty()) {
            temp.push(st.top());
            st.pop();
        } 
        int ans = temp.top(); temp.pop();
        while (!temp.empty()) {
            st.push(temp.top());
            temp.pop();
        }
        return ans;
    }
};
/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

效率:耗费空间少,但是时间慢,因为在删除元素时浪费了太多时间。

执行用时:1300 ms, 在所有 C++ 提交中击败了5.89% 的用户
内存消耗:212 MB, 在所有 C++ 提交中击败了100.00% 的用户

思路2:使用 inputoutput 两个栈。删除元素时仅需删除 output 栈顶元素即可。

代码2:

class CQueue {
public:
    stack<int> input, output;
    CQueue() {}
    
    void appendTail(int value) {
        input.push(value);
    }
    
    int deleteHead() {
        if (input.empty() && output.empty()) return -1;
        if (output.empty()) {
            while (!input.empty()) {
                output.push(input.top());
                input.pop();
            }
        }
        int ans = output.top(); output.pop();
        return ans;
    }
};

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

效率:

执行用时:728 ms, 在所有 C++ 提交中击败了55.06% 的用户
内存消耗:103.6 MB, 在所有 C++ 提交中击败了100.00% 的用户
展开阅读全文

150讲轻松搞定Python网络爬虫

05-16
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: 网络请求:模拟浏览器的行为从网上抓取数据。 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。   从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 【课程服务】 专属付费社群+每周三讨论会+1v1答疑
©️2020 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值