数据结构(四)--队列及面试常考的算法
一、队列介绍
1、定义
与栈相似,队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO(后进先出),而队列是FIFO,即先进先出。

2、优缺点及使用场景
优点:先进先出(FIFO)特性、简单明了的接口、任务调度、广度优先搜索(BFS)、消息传递等。
缺点:随机访问困难、固定容量的队列可能导致溢出、不适用于特定的场景、不适用于高并发场景。
使用场景:任务调度、广度优先搜索(BFS)、消息传递等。
3、基本操作
Enqueue()——在队列尾部插入元素
Dequeue()——移除队列头部的元素
isEmpty()——如果队列为空,则返回true
Top()——返回队列的第一个元素
二、常考算法
1、使用队列表示栈
题目:使用队列实现栈的下列操作:
- push(x) -- 元素 x 入栈
- pop() -- 移除栈顶元素
- top() -- 获取栈顶元素
- empty() -- 返回栈是否为空
思路:用两个队列que1和que2实现队列的功能,que2其实完全就是一个备份的作用,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。
#include<queue>
#include<iostream>
using namespace std;class StackWithQueue{
public:queue<int> queue1;queue<int> queue2; // 辅助队列,用来备份void push(int data){queue1.push(data);}int pop(){if (queue1.size() == 0) return false;while(queue1.size() > 1){queue2.push(queue1.front());queue1.pop();}int result;result = queue1.front(); // 留下的最后一个元素就是要返回的值queue1.pop();queue1 = queue2;while (!queue2.empty()){ //queue1 = queue2,queue2 = 空 queue2.pop();} return result;}int top(){return queue1.back();}bool empty(){return queue1.empty();}
};int main(){StackWithQueue stack;stack.push(1);stack.push(2);cout << stack.pop() << endl;cout << stack.top() << endl;stack.push(3);cout << stack.top() << endl;stack.push(4);cout << stack.pop() << endl;cout << stack.pop() << endl;cout << stack.pop() << endl;if (stack.empty()){cout << "True";}else cout << "False";
}
- 时间复杂度: pop为O(n),其他为O(1)
- 空间复杂度: O(n)

2、对队列的前k个元素倒序
题目:现有一个整数队列, 需要将其前 k 个元素进行逆置, 剩余的元素保持原来的顺序。
示例:input:[1,2, 3, 4, 5, 6, 7, 8, 9,10], k = 3;
output:[3, 2, 1, 4, 5, 6, 7, 8, 9, 10]
思路:将前k个元素入栈,再将栈中元素入新队列中,最后将原队列的剩余元素入新队列中。
需要一个新队列用来装结果,需要一个栈用来对元素倒序。(利用栈先进后出,队列先进先出。 )
#include<stack>
#include<queue>
#include<iostream>
using namespace std;queue<int> reverse_k_elements(queue<int> queue, int k){stack<int> st;for(int i = 0; i < k; i++){st.push(queue.front());queue.pop();}while(!st.empty()){queue.push(st.top());st.pop();}for(int j = 0; j < queue.size() - k; j++){queue.push(queue.front());queue.pop();}return queue;
}int main(){queue<int> queue, que;int i = 1;while(i < 11){queue.push(i);i++;}que = reverse_k_elements(queue, 3);while(!que.empty()){cout << que.front() << ',';que.pop();}
}
3、使用队列生成从1到n的二进制数
题目:给定值k, 打印1到k的二进制数。
示例:input:5;output:[1, 10, 11, 100, 101]
思路:利用队列的先进先出性质和二进制数的特点来实现。以下是具体的思路:
使用队列存储二进制数-->循环生成下一个二进制数-->重复直到达到n个二进制数。
#include<queue>
#include<iostream>
using namespace std;queue<string> generate_binaray_numbers(int k){queue<string> queue1, queue2;queue1.push("1");string cur;for(int i = 0; i < k; i++){cur = queue1.front();queue1.pop();queue2.push(cur);queue1.push(cur + "0");queue1.push(cur + "1");}return queue2;
}int main(){queue<string> que;que = generate_binaray_numbers(10);while(!que.empty()){cout << que.front()<<endl;que.pop();}return 0;
}
相关文章:
数据结构(四)--队列及面试常考的算法
一、队列介绍 1、定义 与栈相似,队列是另一种顺序存储元素的线性数据结构。栈与队列的最大差别在于栈是LIFO(后进先出),而队列是FIFO,即先进先出。 2、优缺点及使用场景 优点:先进先出(FIFO&…...
PMIC、电源管理MAX77646ANP、MAX77647AANP、MAX77675AEWE、MAX77847AEWL DC-DC 开关稳压器
一、MAX77646ANP、MAX77647AANP 低IQ SIMO PMIC支持原电池应用的1.8V工作电压 MAX77646/MAX77647为尺寸和效率至关重要的低功耗应用提供电源解决方案。该IC集成单电感多输出(SIMO)降压/升压稳压器,可通过单个电感提供三个可独立编程的电源轨,尽可能地减…...
5W2H分析法:全面思考和解决问题的实用工具
5W2H分析法又叫七问分析法,创于二战中美国陆军兵器修理部。发明者用五个以W开头的英语单词和两个以H开头的英语单词进行设问,发现解决问题的线索,寻找发明思路,进行设计构思,从而搞出新的发明项目。5W2H简单、方便&…...
01 向量基本概念
向量基本概念 向量是什么物理专业学生视角计算机专业学生视角数学家视角 不同视角之间的关系 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 向量是什么 物理专业学生视角 向量是空间中的箭头。向量的长度和方向确定一个向量。只要长度和方向相同,…...
QMS质量检验管理|攻克制造企业质量检验难题,助力企业提质增效
在日益激烈的市场竞争中,对产品质量严格把关,是制造企业提高核心竞争力与品牌价值的关键因素。那如何高效、高质地完成产品质检工作?这就需要企业在工业质检中引进数字化技术加以辅助,进而推动智能制造高质量发展。 蓝库云QMS质量…...
Visual Components Robotics OLP解决方案 北京衡祖
Visual Components 引入了“Visual Components Robotics OLP”的重大升级,合并了制造模拟和机器人离线编程。该解决方案利用 Delfoi Robotics 的技术,提高生产率、减少停机时间并减少浪费。 一、探索下一代离线机器人编程软件 自 1999 年以来࿰…...
React——简便获取经纬度信息
引言 在现代的Web应用程序中,获取用户的地理位置信息是一项常见的需求。通过获取经纬度信息,我们可以为用户提供个性化的服务和定位功能。在本文中,我们将介绍如何在React应用程序中简便地获取用户的经纬度信息,并提供相应的代码…...
如何修改设置360浏览器内核模式
360安全浏览器现有两种内核模式,即“极速模式”和“兼容模式” 极速模式 “极速模式”是以Blink(Webkit)为内核的浏览模式,Blink内核具有更高的网页浏览速度和更好网页渲染效果。但由于少部分网银、政府、税务、办公系统等网站对B…...
spring boot 定时任务@Scheduled(cron = ““)不可用时并且注入失败时——笔记
以下方案是本人使用定时任务时Service注入失败的解决方案 在 Spring Boot 中执行定时任务时,你可以注入并直接调用 Service 中的方法,就像在普通的业务逻辑中一样。 以下是执行定时任务时调用 Service 的步骤: 创建一个 Service 类…...
R语言用jsonlite库写的一个图片爬虫
以下是一个使用R语言和jsonlite库下载图片的程序。首先,我们需要导入jsonlite库和options()函数,然后将代理服务器的主机名和端口号设置为"duoip"和"8000"。接着,我们将URL设置为"https://yun.baidu.com/"&…...
Linux多线程编程- pthread_self()
pthread_self() 函数是 POSIX 线程库的一部分,它提供了一个非常简单的功能:获取当前线程的唯一标识符。这个标识符是 pthread_t 类型的,通常是一个无符号的长整型值,不过具体的类型是由实现定义的,这意味着它可以在不同…...
APM建设踩了哪些坑?去哪儿旅行分布式链路追踪系统实践
一分钟精华速览 分布式链路追踪系统在企业的APM体系中扮演着重要的角色。本文分享了去哪儿旅行构建分布式链路追踪系统的实践经验。从APM整体架构设计入手,讲述了日志收集、Kafka传输和Flink任务处理等环节的性能优化实践和踩坑经验。 同时,作者结合丰…...
ASTM F963-23美国玩具安全新标准发布
新标准发布 2023年10月13日,美国材料与试验协会(ASTM)发布了新版玩具安全标准ASTM F963-23。 主要更新内容 与ASTM F963-17相比,此次更新包括:单独描述了基材重金属元素的豁免情况,更新了邻苯二甲酸酯的管控…...
swift语言下SurfGen库做的爬虫是什么样的 ?
Swift语言并没有内置的爬虫库,但是你可以使用第三方库来实现爬虫功能。其中比较常用的是Alamofire和SwiftyJSON。Alamofire是一个基于Swift语言的HTTP网络库,可以用来发送HTTP请求和接收HTTP响应。而SwiftyJSON则是一个用于处理JSON数据的Swift库&#x…...
Vue纯CSS实现掷色子
效果图: 实现代码 直接利用CSS3动画实现的效果,无js代码。 <template><div class"wrap"><input type"checkbox" id"roll"><label for"roll"><div class"content"><…...
使用vscode开发uniapp项目常用的辅助插件,提升开发效率
为什么不使用hbuilder开发呢?因为hbuilder对ts和vue3语法支持并不友好,而且代码提示不智能,也不能使用最近很流行的coplit和CodeGeex智能提示,所以就换掉hbulider,使用我们熟悉的vscode开发吧。 第一个:un…...
python脚本监听域名证书过期时间,并将通知消息到钉钉
版本一: 执行脚本带上 --dingtalk-webhook和–domains后指定钉钉token和域名 python3 ssl_spirtime.py --dingtalk-webhook https://oapi.dingtalk.com/robot/send?access_tokenavd345324 --domains www.abc1.com www.abc2.com www.abc3.com脚本如下 #!/usr/bin…...
那些看起来高大上的封装函数
什么 ToGray 只支持3通道图像, 让我看看怎么个事 就这么生硬的加了个判断 好家伙 调用了下opencv ,通道数都不判断一下...
go语言 | grpc原理介绍(三)
了解 gRPC 通信模式中的消息流 gRPC 支持四种通信模式,分别是简单 RPC、服务端流式 RPC、客户端流式 RPC 和双向流式 RPC。 简单 RPC 在gRPC中,一个简单的RPC调用遵循请求-响应模型,通常涉及以下几个关键步骤和组件: 请求头&a…...
记一次heapdump泄漏获取服务器权限
文章目录 一、漏洞原因二、漏洞利用三、漏洞进一步利用1、工具下载2、通过关键字查询3、通过配置redis的默认账号和密码进行登录4、添加定时计划任务,进行反弹shell5、成功获取服务器的shell补充四、总结五、免责声明一、漏洞原因 扫描目录发现某个spring框架存在大量泄露信息…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
