LeetCode 232 Implement Queue using Stacks(用栈来实现队列)(*)

简介: 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50550978 翻译用栈来实现队列的下列操作。
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50550978

翻译

用栈来实现队列的下列操作。

push(x) —— 将元素x写入到队列的尾部
pop() —— 从队列首部移除元素
peek() —— 返回队列首部元素
empty() —— 返回队列是否为空

注意:

你必须使用一个只有标准操作的栈。

也就是说,只有push/pop/size/empty等操作是有效的。

栈可能不被原生支持,这取决于你所用的语言。

只要你只是用stack的标准操作,你可以用list或者deque(double-ended queue)来模拟栈。

你可以假设所有的操作都是有效的(例如,pop或peek操作不会被用在空队列上)。

原文

Implement the following operations of a queue using stacks.

push(x) -- Push element x to the back of queue.
pop() -- Removes the element from in front of queue.
peek() -- Get the front element.
empty() -- Return whether the queue is empty.

Notes:

You must use only standard operations of a stack 

-- which means only push to top, peek/pop from top, size, and is empty operations are valid.

Depending on your language, stack may not be supported natively. 

You may simulate a stack by using a list or deque (double-ended queue), 

as long as you use only standard operations of a stack.

You may assume that all operations are valid (for example, 

no pop or peek operations will be called on an empty queue).

分析

大家可以看到,我们一共需要写4个函数,其实有两个可以直接写出来。

大家看着下文的代码,首先定义两个stack,可以回顾一下题目的第一句话:

Implement the following operations of a queue using stacks.

其实中文博大精深,英文同样也是的,这里很好的透露了是用多个stack来描写一个queue。一个主攻、一个辅助,多好……

push的话,不论是栈还是队列,都是从后面推上去,就一行;empty也是一样的。

下面来看看如何取出第一个元素,对于队列,我们peek的应该是最先进去的,但对于队列,我们最先取出的确是最后进去的。

喔,我忘了,可能有童鞋不太了解栈和队列的各种操作以及区别,可以看看我的这篇文章,非常详细的解释了它们。

【算法】7 分不清栈和队列?一张图给你完整体会

所以再看下面的代码,如果栈中只有一个元素,那么毫无疑问,就是它了。

如果有多个元素,首先将它们全部转移到另一个栈中,这时候它的顺序会反过来,然后留下一个元素。

这个部分就是pop和peek的关键了,peek的话只是取出这个数据出来,这个元素还是应该要保存起来的,所以我们也把它给了s2;而pop中则是直接给弹出了,这个数据也就不会进入s2。

当上面的操作完成之后,再将s2的数据全部转移到s中,这时候刚刚被颠倒的数据又恢复了原先的顺序。

在测试代码的过程中,还额外写了Queue的size,其实也只是一行而已,那就是求s的size。

这道题如果已经写完看完了,可以继续下面这道题喔:LeetCode 225 Implement Stack using Queues(用队列来实现栈)(*)

Ok,这篇文章因为是我晚上在床上靠着枕头写的,所以写的比较乱……之前四百多篇都是正儿八经坐着写的。

代码

class Queue {
public:
    stack<int> s, s2;
    // Push element x to the back of queue.
    void push(int x) {
        s.push(x);
    }

    // Removes the element from in front of queue.
    void pop(void) {
        if (s.size() == 1)
            s.pop();
        else {
            while (s.size() > 1) {
                s2.push(s.top());
                s.pop();
            }
            s.pop();
            while (s2.size() > 0) {
                s.push(s2.top());
                s2.pop();
            }
        }
    }

    // Get the front element.
    int peek(void) {
        if (s.size() == 1) return s.top();
        while (s.size() > 1) {
            s2.push(s.top());
            s.pop();
        }
        int temp = s.top();
        s2.push(s.top());
        s.pop();
        while (s2.size() > 0) {
            s.push(s2.top());
            s2.pop();
        }
        return temp;
    }

    // Return whether the queue is empty.
    bool empty(void) {
        return s.empty();
    }
};
目录
相关文章
|
2月前
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
15 0
|
2月前
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
26 0
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
34 4
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 09. 用两个栈实现队列
使用两个栈实现队列的Python解决方案,包括初始化两个栈、实现在队列尾部添加整数的appendTail方法和在队列头部删除整数的deleteHead方法,以及相应的示例操作。
41 2
|
4月前
|
Python
【Leetcode刷题Python】641.循环双端队列
文章介绍了如何实现一个循环双端队列,包括其操作如插入、删除、获取队首和队尾元素,以及检查队列是否为空或已满,并提供了Python语言的实现代码。
26 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
128 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
46 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口