入门级题解:剑指 Offer 09. 用两个栈实现队列

2023-10-30

题目

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

读题

队列:先入先出
栈:先入后出

在队列尾部插入整数和在队列头部删除整数的功能
对外界是个黑盒,内部构造不知道,只输入输出
插入 1 1
删除 null
插入 2 2
删除 null
删除 返回-1
原来比如栈是 1 2 3 4 5
那现在就从尾部插入是 1 2 3 4 5 6
头部删除 就删1 得到2 3 4 5 6

如果只用一个栈,只能入栈,尾部插入比较好实现,直接入栈就可以,但头部删除不方便,得全部出栈
所以设stack1:1 2 3 4 5插入的话就直接入stack1
再设stack2:把stack1中的先出栈再入栈,换个顺序,现在就是 5 4 3 2 1

伪代码

队列尾部插入整数:stack1.push_back()
stack2.push_back(stack1.pop())
队列头部删除整数:stack2.pop

关键代码分析

 if(sta2.empty()){
            while(!sta1.empty()){
            sta2.push(sta1.top());
            sta1.pop();
            }
        }

为什么只有sta2空的时候才把sta1的给他出栈送过来
例子: sta1 从底到top是 a b c d e f
sta2空的
给sta2:f e d c b a
sta2删除一个 f e d c b
sta1 加1 个:sta1: o
如果这时候给sta2:f e d c b o
这样次序就乱了,正确的次序应该是 o f e d c b
所以得sta2空了再颠倒次序。

收获

  1. 建栈:stack sta;
  2. 入栈:sta.push();
  3. 出栈:sta.pop();
  4. sta.pop()是个操作,不是值,用sta.top();

代码

 class CQueue {
    stack <int> sta1;
    stack <int> sta2;
public:
    CQueue() {
     
    }
    //队列尾部插入整数
    void appendTail(int value) {
        sta1.push(value);
        //int top1 = sta1.top();//测试数据
    }
    
    int deleteHead() {
        if(sta2.empty()){
            while(!sta1.empty()){
            sta2.push(sta1.top());
            sta1.pop();
            }
        }
        
        if(sta2.empty()){
            return -1;
        }
        int delItem = sta2.top();
        sta2.pop();
        return delItem;
    }
};

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

入门级题解:剑指 Offer 09. 用两个栈实现队列 的相关文章

随机推荐

  • Keil 5报错identifier “KEY0“ is undefined怎末解决呀大侠们【哭】

    错误 HARDWARE EXTI exti c 42 error 20 identifier KEY0 is undefined key c include key h include delay h 按键初始化函数 PA0 15和PC5
  • 把一个对象的key全部换成大写/小写

    前言 把一个对象 他的key都是大写 或者小写的情况下给他转换类型 大写 小写 实现效果 实现方法 1 封装两个方法 大写转换 export function upperJSONKey jsonObj for var key in json
  • robot framework 使用五:CentOS上运行robot framework 并自动发送测试结果

    操作系统版本 centos 6 0 x86 64 想要在linux上运行robot framework的测试用例 需要安装以下工具和软件 1 安装python 2 7 6 首先python version 查看系统是否装有python 并且
  • Python编程:实现整数反转(含完整源代码)

    Python编程 实现整数反转 含完整源代码 在Python中 实现整数反转非常简单 我们只需要将整数转换为字符串 然后对字符串进行反转操作 最后再将反转后的字符串转换回整数即可完成整数反转 下面是实现整数反转的Python源代码 def
  • 深入浅出--梯度下降法及其实现

    转自 https www jianshu com p c7e642877b0e 深入浅出 梯度下降法及其实现 六尺帐篷 关注 2018 01 17 21 06 字数 3001 阅读 1210 评论 2 喜欢 23 赞赏 1 梯度下降的场景假
  • 常用文件的文件头(十六进制)

    JPEG jpg 文件头 FFD8FF PNG png 文件头 89504E47 GIF gif 文件头 47494638 TIFF tif 文件头 49492A00 Windows Bitmap bmp 文件头 424D CAD dwg
  • 嘀嗒出行再闯IPO:千军万马我无懈

    羽扇纶巾笑谈间 千军万马我无懈 在激烈竞争中再度冲刺港交所IPO的嘀嗒出行 闪露出一丝歌词里的气魄 交通运输部下属网约车监管信息交互系统的数据显示 截至2023年1月31日 全国共有300家网约车平台公司取得网约车平台经营许可 在2022年
  • 隐式声明函数‘raw_copy_to_user’的问题

    隐式声明函数 raw copy to user 的问题 其实一般来说都是隐式声明函数 copy to user 的问题 这类问题你就看看有没有引用正确的头文件 例如有些是
  • 一些常见面试OO design题目总结

    最近很多公司面试喜欢问一些OO design的题目 我总结了一些比较高频的题目 需求不一定准确 设计的也不一定好 欢迎提出建议 1 电梯设计 2 停车厂设计 3 通用卡牌游戏blackjack设计 4 1 电梯设计 需求 以面向对象的方式设
  • vue知识点总结

    vue知识点总结 1 vue是渐进式的javaScript框架 其作者是尤雨溪是以为华裔前google工程师 是一个动态构建用户界面 个人理解为可以在一个界面中动态展示其中某一部分的数据显示 运行 转换等功能 相比于jsp html页面有着
  • VRRP技术(详解)

    一 VRRP的概述 用户一般都是采用一个默认的网关来访问外部网络 如果此时默认网关设备发生故障 将中 断所有用户终端的网络访问 导致不可挽回的损失 VRRP可以实现多网关 并且可以解决多网关运行中冲突的错误 二 VRRP术语 VRRP路由器
  • jvm面试题,jvm常见高频面试题汇总,必知必会

    1 Java 类加载过程 Java 类加载需要经历一下 7 个过程 1 加载 加载是类加载的第一个过程 在这个阶段 将完成一下三件事情 通过一个类的全限定名获取该类的二进制流 将该二进制流中的静态存储结构转化为方法去运行时数据结 构 在内存
  • 线程安全性分类

    1 不可变 不可变的对象一定是线程安全的 并且永远也不需要额外的同步 因为一个不可变的对象只要构建正确 其外部可见状态永远也不会改变 永远也不会看到它处于不一致的状态 Java 类库中大多数基本数值类如Integer String和BigI
  • Mysql5.7 + 查询并解析json数据方法(后转)

    说明 本文是对 Mysql5 7 查询并解析json数据方法 的补充说明 具体请点击查看 当前 也可以认为就是水贴 对于某个属性的值未数组的时候 我们取某一条中某一条某个元素 大家应该都理解了 具体 如下 详情请看上一篇 Mysql5 7
  • HBase Java API使用IDEA开发----mapreduce读取hdfs文件写入hbase

    一 配置hadoop读取hbase的支持包 在hadoop env sh 添加export HADOOP CLASSPATH HBASE HOME lib 没有配置HBASE HOME的去 etc profile配置环境变量 路径根据你自己
  • Verilog 实现千兆网UDP协议 基于88E1111--数据接收

    注 此版本没有添加ARP PING 等 未完待续 注 项目采用Verilog开发 基于Vivado编译器 注 本版本没有计算校验 与上一篇相同开发环境 采用三段式状态机 同样 接收后将数据写入FIFO 相比于数据发送更为简单 只需在写入数据
  • 蚁群算法原理及python实现

    蚁群算法 ACO 是属于元启发式算法的一种 是一种群体的智能方法 算法原理 蚂蚁在寻找食物源时 会在其经过的路径上释放一种信息素 并能够感知其它蚂蚁释放的信息素 信息素浓度的大小表征到食物源路径的远近 信息素浓度越高 表示对应的路径距离越短
  • 通过按钮实现跳转新的xml界面

    首先创建关联跳转xml文件的class文件 package com example androidui import android app Activity import android os Bundle public class Ac
  • 算法——树查找算法

    树查找 对于层次结构的树 需要遍历其节点 根据遍历方式不同 可分为广度优先和深度优先 对于如下树结构 class TreeNode
  • 入门级题解:剑指 Offer 09. 用两个栈实现队列

    题目 用两个栈实现一个队列 队列的声明如下 请实现它的两个函数 appendTail 和 deleteHead 分别完成在队列尾部插入整数和在队列头部删除整数的功能 若队列中没有元素 deleteHead 操作返回 1 读题 队列 先入先出