Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >算法-两个栈实现队列

算法-两个栈实现队列

作者头像
chaibubble
发布于 2018-01-02 03:38:47
发布于 2018-01-02 03:38:47
73300
代码可运行
举报
运行总次数:0
代码可运行

题目: 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T> class CQueue
{
public:
    CQueue(void);
    ~CQueue(void);

    // 在队列末尾添加一个结点
    void appendTail(const T& node);

    // 删除队列的头结点
    T deleteHead();

private:
    stack<T> stack1;
    stack<T> stack2;
};

解题思路: 首先这个题目要完成两个栈实现队列,其次还涉及到C++类和模板的一些知识,先说前面: 我们知道,是一种后入先出的结构,而队列恰恰相反,是一种先入先出的结构,需要用栈实现队列,这意味着我们有现成的push和pop可以用,以实现入队和出队。

现在有两个栈stack1和stack2,我们向stack1依次压入a,b,c三个值,stack2为空:

此时出栈的话,顺序为c,b,a,但是出队的顺序应该是a,b,c,为了实现想要的出队顺序,我们可以把stack1里面的内容依次压入stack2中:

此时再将stack2内的内容做出栈,将弹出a:

下面讨论再次入队的情况,将d压入stack1,此时两个栈的情况:

此时出队的话,在stack2中还有值的话,直接出栈stack2,弹出b,c。此时stack2中已经没有值了,需要再次从stack1中出栈到stack2中入栈,然后再次stack2的出栈,弹出d。这与队列的出队形式完全相同:

我们可以根据上面的实验整理出一个编程思路,如果stack2中没有值,就做stack1到stack2的压栈,如果有就做stack2的出栈,而不管stack1有没有值都可以做入栈。

下面需要考虑的是C++的模板,使用模板的目的就是能够编写与类型无关的代码,在上面例子中使用了a,b,c,d,那么在实例化对象时T就行该是char,比如实例化一个叫做queue的对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CQueue<char> queue;

此外,由于deleteHead函数return不为空,所以他的类型是T,此外appendTail和deleteHead都是在类内声明,类外定义的函数,所以在定义函数时要加类名。

代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T> CQueue<T>::~CQueue(void)
{
}

template<typename T> void CQueue<T>::appendTail(const T& element)
{
    stack1.push(element);
} 

template<typename T> T CQueue<T>::deleteHead()
{
    if(stack2.size()<= 0)
    {
        while(stack1.size()>0)
        {
            T& data = stack1.top();
            stack1.pop();
            stack2.push(data);
        }
    }

    if(stack2.size() == 0)
        throw new exception("queue is empty");

    T head = stack2.top();
    stack2.pop();

    return head;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一天一大 leet(用两个栈实现队列)难度:简单 DAY-30
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
前端小书童
2020/09/24
3160
一天一大 leet(用两个栈实现队列)难度:简单 DAY-30
【每日一题】【leetcode】18.栈&队列-用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 难易程度:easy
aneutron
2022/08/10
2500
剑指Offer - 面试题9. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
Michael阿明
2020/07/13
3240
剑指Offer - 面试题9. 用两个栈实现队列
剑指Offer面试题:6.用两个栈实现队列
  原文是使用C++结合模板实现的定义,这里我们采用C#结合泛型来实现这个队列的定义,我们要实现的就是两个方法:AppendTail与DeleteHead
Edison Zhou
2018/08/20
4230
剑指Offer面试题:6.用两个栈实现队列
LeetCode-面试题09-用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
benym
2022/07/14
2100
剑指offer第6题:使用两个栈实现队列
对于这种数据结构的实现类题目,出题者的意图主要还是想让我们对这种数据结构具有深刻的了解。对于栈而言,具有先进后出的特点,而对于队列而言,具有先进先出的特点。所以根据这些特点我们来分析此题。
鹏-程-万-里
2020/07/20
5170
用两个栈就能造一个队列
今天给大家带来一个有意思的题目,思路很easy,但是刚刷题的小伙伴,示例理解起来可能会有点费劲,花里胡哨一大堆是啥意思啊。在之前的文章《不知道这篇文章合不合你的胃口》中写了栈是先进后出,队列是先进先出。本题让我们用两个先进后出的栈,完成一个先进先出的队列。我们应该怎么实现呢?
公众号袁厨的算法小屋
2020/11/25
4610
用两个栈就能造一个队列
《剑指Offer》附加题_用两个队列实现一个栈_C++版
  在《剑指Offer》中,在栈和队列习题中,作者留下来一道题目供读者自己实现,即“用两个队列实现一个栈”。   在计算机数据结构中,栈的特点是后进先出,即最后被压入(push)栈的元素会第一个被弹出(pop);队列的特点是先进先出,即第一个进入队列的元素将会被第一个弹出来。虽然栈和队列特点是针锋相对,但是两者却相互联系,可以互相转换。   在“用两个队列实现一个栈”问题中,我们用两个队列的压入和弹出来模拟栈的压入和弹出。我们通过画图的手段把抽象的问题形象化。   在上图中,我们先往栈内压入一个元素a。由于
waylon
2018/03/08
1.1K0
用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
五分钟学算法
2022/01/05
3370
用两个栈实现队列
剑指offer(9)——用两个栈实现队列
题目: 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。 思路: 首先定义两个栈stack1、stack2,stack1用于插入,stack2用于删除。删除时如果直接出栈就无法实现先进先出,这时需要将stack1中的所有元素从stack1出栈,然后依次压入stack2中,然后再从stack2中出栈。如果stack2中有元素存在,那么直接出栈,无需将stack1中元素压入stack2中。只有当st
说故事的五公子
2019/09/11
2630
LeetCode 上的一道题目
今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题09. 用两个栈实现队列。
五分钟学算法
2020/06/28
4610
LeetCode 上的一道题目
剑指offer | 面试题7:用两个栈实现队列
提示:1 <= values <= 10000。 最多会对 appendTail、deleteHead进行 10000 次调用
千羽
2021/12/29
2570
剑指offer | 面试题7:用两个栈实现队列
剑指 Offer:09. 用两个栈实现队列
1. 题目 剑指 Offer 09. 用两个栈实现队列 2. 描述 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入: [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]] 输出:[null,null,3,-1] 示例 2: 输
村雨遥
2022/06/15
1770
剑指 Offer 09. 用两个栈实现队列C++
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
莫浅子
2022/11/18
2220
剑指 Offer 09. 用两个栈实现队列C++
剑指 offer| 09. 用两个栈实现队列
我们知道,队列的特点是“先进先出”,栈的特点是“先进后出”。我们来看看下面的操作:
孟君
2023/02/23
3290
剑指 offer| 09. 用两个栈实现队列
算法图解:如何用两个栈实现一个队列?
队列和栈是计算机中两个非常重要的数据结构,经过前面的学习(《队列》、《栈》)我们知道了它们各自的特点,队列是先进先出(FIFO)的,而栈是先进后出(FILO)的,那如何用栈来实现队列呢?这可是一道经典的面试题,所以本文我们就来实现一下。
磊哥
2020/10/29
4690
算法图解:如何用两个栈实现一个队列?
剑指 Offer 09. 用两个栈实现队列
队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,
Vincent-yuan
2021/06/29
2560
剑指Offer 面试题09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
手撕代码八百里
2020/07/28
7220
日拱算法:用两个栈实现队列&amp;包含min函数的栈
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
掘金安东尼
2022/09/19
3120
日拱算法:用两个栈实现队列&amp;包含min函数的栈
剑指Offer:面试题09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
Yuyy
2022/06/28
2240
相关推荐
一天一大 leet(用两个栈实现队列)难度:简单 DAY-30
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验