算法训练营第十天 | LeetCode 232 用栈实现队列、LeetCode 225 用队列实现栈

栈的实现有顺序表和链式表两种,也就是数组和链表实现。

其中抽象栈类的私有成员函数有operator=的重载函数和stack的构造函数,为了保护栈的构造和拷贝被保护。公有成员函数有Stack(),~Stack(),clear(),push(),pop(),top()和length(),这些函数中后五种均为虚函数=0,参数和返回值都要加const限定,参数还是引用限定。

具体类的实现就比较简单了,在上述函数的基础上,私有成员函数变成了maxSize,top元素值下标和指向存储数组起始位置的指针,公有成员函数中构造函数将maxSize赋值为参数size,top值置为0,给数组申请size大小的动态空间。虚构函数直接delete该动态空间起始地址即可。clear函数将top直接置为0,push、pop、topValue为数组取值操作,需要加Assert断言判断是否满足条件。由于数组采取下标访问,length函数直接返回top值即可。

链式栈同样继承该抽象类,基本和链表实现差不多,有意思的是这个函数:

b16bfc62a859492ab8246a39de59080e.png

每次申请新的节点的动态空间的时候,将原先它自己的地址作为新节点next指针指向的地址来实现栈,也是蛮有意思的。

队列的抽象类和栈的抽象类基本相同,主要更换的是类名和同类型函数名。

具体类实现之后再说,先看第一题

LeetCode 232 用栈实现队列

这题其实比较简单,定义一个输入栈,一个输出栈,把原先输入进去的数存放在输入栈中,到要使用的时候再把数据全部push到输出栈中,就由原先的后入先出变成先入先出了。只是进阶要求时间复杂度O(1),我其实怎么想都没想出来,因为要进行上述操作一定要循环,我以为循环就不可能是O(1)了,但题解说是均摊O(1),对每个元素要输出的时候就只需要导入元素个数次,所以均摊O(1),感觉确实是这样,但还要好好理解下。

代码如下:

class MyQueue {
private:
    stack<int> instack;
    stack<int> outstack;
    void in2out() {
        while (!instack.empty()) {
            outstack.push(instack.top());
            instack.pop();
        }
    }
public:
    MyQueue() {
        while (!instack.empty()) instack.pop();
        while (!outstack.empty()) outstack.pop();
    }
    
    void push(int x) { 
        instack.push(x);
    }
    
    int pop() {
        if (outstack.empty()) in2out();
        int ret = outstack.top();
        outstack.pop();
        return ret;
    }
    
    int peek() {
        if (outstack.empty()) in2out();
        return outstack.top();
    }
    
    bool empty() {
        return (instack.empty() && outstack.empty());
    }
};

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue* obj = new MyQueue();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->peek();
 * bool param_4 = obj->empty();
 */

这题有类设计的感觉了。

队列的实现就比栈要复杂很多,今天有事在身,改天再专门写一篇文章(立个FLAG)来讲这个。

先把第二题给刷了打完卡要紧。

LeetCode 225 用队列实现栈

这题也挺简单,两个队列直接模仿上述解法即可,也比较简单,之前一刷写过了,这里不再赘述。简单说下一个队列的解法:每次要取数的时候,把前n-1个数全部挪到后面即可。所以要用一个变量size记录队列元素个数。代码如下:

class MyStack {
    queue<int> myque;
    int size = 0;
    void adjust() {
        if (size > 1) {
            for (int i = 0; i < size - 1; i++) {
                int temp = myque.front();
                myque.pop();
                myque.push(temp);
            }
        }
    }
public:
    MyStack() {
        while (!myque.empty()) myque.pop();
        size = 0;
    }
    
    void push(int x) {
        myque.push(x);
        size++;
    }
    
    int pop() {
        adjust();
        int ret = myque.front();
        myque.pop();
        size--;
        return ret;
    }
    
    int top() {
        adjust();
        int ret = myque.front();
        myque.pop();
        myque.push(ret);
        return ret;
    }
    
    bool empty() {
        return myque.empty();
    }
};

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack* obj = new MyStack();
 * obj->push(x);
 * int param_2 = obj->pop();
 * int param_3 = obj->top();
 * bool param_4 = obj->empty();
 */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/587522.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决Redis的键值前出现类似\xAC\xED\x00\x05t\x00*这样的字符序列

文章目录 1.问题2.解决方法3.StringRedisTemplate和RedisTemplate的区别 1.问题 在使用RedisTemplate对Redis进行操作时,发现Reids键值对前有\xAC\xED\x00\x05t\x00*这样的字符序列 如图所示: 虽说不影响使用,但是听影响观感的 2.解决方法 查找了很多方法,可以指定RedisTem…

数据结构实验--实验02 栈的应用(数制转换及回文判断)

一、实验内容 二、算法实现 1、用栈的特性实现进转换的思路&#xff1a;参考手算求进制转换的思路——除r取余法&#xff0c;这里的r表示基数&#xff0c;8进制的基数就是8&#xff0c;那么将十进制数转换成8进制数手算的方法就是除8取余法&#xff0c;具体手算方法如图&#…

在安装有Acer软件保护卡的电脑上安装PRCS6

PRCS6下载地址https://www.yuque.com/u33774918/pqzsy8/gdo8n6hibxgzsghw 第一步&#xff0c;电脑开机进入windows系统 第二步&#xff0c;解压PRCS6到电脑桌面 第三步&#xff0c;打开电脑桌面的PRCS6文件夹&#xff0c;双击‘点我安装’&#xff0c;开始安装 第四步&…

windows浅尝NW.js

windows浅尝NW.js 在本指南中&#xff0c;我们将详细介绍如何在windows上部署NW.js,实现应用的构成、启动方式、开发环境 环境部署 首先我们需要从官网下载对应的压缩包 (https://nwjs.io/downloads/) 下载完成后解压&#xff0c;可以看到对应的文件目录 然后我们运行目录下…

数据结构与算法实验题五道 A一元多项式的求导 B还原二叉树 C 六度空间 D 基于词频的文件相似度 E 模拟excel排序

A (1) 输入格式说明&#xff1a; 以指数递降方式输入多项式非零项系数和指数&#xff08;绝对值均为不超过1000的整数&#xff09;。数字间以空格分隔。 (2) 输出格式说明&#xff1a; 以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔&#xff0c;但…

ffmpeg中stream_loop参数不生效原因分析

问题 使用ffmpeg把一个视频文件发布成一个rtmp流&#xff0c;并设置成循环推流&#xff0c;此时需要使用参数stream_loop&#xff0c;命令如下: ffmpeg.exe -stream_loop -1 -re -i D:\tools\ffmpeg-5.1.2\bin\sei.h264 -c copy -f flv -safe 0 rtmp://localhost:1935/live/te…

【智能算法】鹦鹉优化算法(WO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2024年&#xff0c;J Lian等人受到鹦鹉学习行为启发&#xff0c;提出了鹦鹉优化算法&#xff08;Parrot Optimizer, PO&#xff09;。 2.算法原理 2.1算法思想 PO灵感来自于在驯养的鹦鹉中观察到的…

go稀疏数组

稀疏数组 稀疏数组 稀疏数组 package testimport ("encoding/json""fmt""io/ioutil""log""reflect""testing" )type ValNode struct {Row int json:"row"Col int json:"col"Val int json:&qu…

分布式与一致性协议之Raft算法与一致哈希算法(一)

Raft算法 Raft与一致性 有很多人把Raft算法当成一致性算法&#xff0c;其实它不是一致性算法而是共识算法&#xff0c;是一个Multi-Paxos算法&#xff0c;实现的是如何就一系列值达成共识。并且&#xff0c;Raft算法能容忍少数节点的故障。虽然Raft算法能实现强一致性&#x…

黑马 - websocket搭建在线聊天室

这里写自定义目录标题 一、消息推送常见方式二、websocket 是什么&#xff1f;三、websocket api的介绍1、客户端 &#xff08;浏览器&#xff09; 四、实现在线聊天室1、需求2、聊天室流程分析3、消息格式4、代码实现 一、消息推送常见方式 1、轮训方式 2、SSE&#xff08;…

通用漏洞评估系统CVSS4.0简介

文章目录 什么是CVSS&#xff1f;CVSS 漏洞等级分类历史版本的 CVSS 存在哪些问题&#xff1f;CVSS 4.0改进的“命名法”改进的“基本指标”考虑“OT/IOT”新增的“其他指标”CVSS 4.0存在的问题 Reference: 什么是CVSS&#xff1f; 在信息安全评估领域&#xff0c;CVSS为我们…

IP-guard WebServer 2024年两个漏洞简单分析

前言 这个漏洞看完索然无味&#xff0c;但是手上又刚好有源码&#xff0c;不看他一下又觉得可惜 权限绕过漏洞(QVD-2024-14103)简单分析 网上冲浪的时候&#xff0c;看到个买不起的CSDN专栏 这里基本上定位到是_mApplyList 出了问题&#xff0c;前面两个是ipguard webserve…

MATLAB 函数

MATLAB 函数 函数是一起执行任务的一组语句。在MATLAB中&#xff0c;函数是在单独的文件中定义的。文件名和函数名应该相同。 函数在其自己的工作空间&#xff08;也称为本地工作空间&#xff09;中对变量进行操作&#xff0c;与在MATLAB命令提示符下访问的工作空间&#xff0…

口袋实验室--使用AD2学习频谱参数测试

目录 1. 简介 2. 频谱相关参数 2.1 频谱相关基本概念 2.1.1 采样时间间隔 2.1.2 采样频率 2.1.3 采样点数 2.1.4 采样时间长度 2.1.5 谱线数 2.1.6 奈奎斯特频率 2.1.7 频谱分辨率 2.1.8 最高分析频率 2.1.9 频谱泄露 2.2 窗函数 2.2.1 AD2的窗函数 2.2.2 测试矩…

[NeurIPS-23] GOHA: Generalizable One-shot 3D Neural Head Avatar

[pdf | proj | code] 本文提出一种基于单图的可驱动虚拟人像重建框架。基于3DMM给粗重建、驱动结果&#xff0c;基于神经辐射场给细粒度平滑结果。 方法 给定源图片I_s和目标图片I_t&#xff0c;希望生成图片I_o具有源图片ID和目标图片表情位姿。本文提出三个分支&#xff1a;…

Ubuntu卸载已安装软件

前言 在Linux系统上安装了一些软件&#xff0c;但是卸载起来相比于Windows系统麻烦的多&#xff0c;这里总结了两种办法&#xff0c;希望对遇到这种问题的小伙伴能够有所帮助 1.Ubuntu Software 卸载 1.点击桌面上的Ubuntu Software并且选择installed 选中想要卸载的软件再按…

ECHARTS学习

坐标轴 option {xAxis: {type: category,data: [A, B, C]},yAxis: {type: value},series: [{data: [120, 200, 150],type: line}] }; 1、坐标轴的默认类型type是数值型&#xff0c;而xAxis指定了类目型的data&#xff0c;所以Echarts也能识别出这是类目型的坐标轴&#xff0c;…

C# 实现格式化文本导入到Excel

目录 需求 Excel 的文本文件导入功能 范例运行环境 配置Office DCOM 实现 组件库引入 OpenTextToExcelFile 代码 调用 小结 需求 在一些导入功能里&#xff0c;甲方经常会给我们一些格式化的文本&#xff0c;类似 CSV 那样的纯文本。比如有关质量监督的标准文件&…

C++入门——基本概念与关键字(上)

兜兜转转终于来到C的学习&#xff0c;C作为一种更高级的语言&#xff0c;是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式&#xff0c;本节笔者旨在带领读者理解C是如何对C语言设计不合理的地方进行优化的&am…

【二叉树——数据结构】

文章目录 1.二叉树1.基本概念.几种特殊的二叉树 2.考点3.二叉树的存储结构4.二叉树的遍历5.线索二叉树 1.二叉树 1.基本概念. 二叉树是n(n>0)个结点的有限集合 或者为空二叉树&#xff0c;即n0 或者由一个根结点和两个互不相交的被称作根的左子树和右子树组成。 每个结点至…