数据结构(四)--队列及面试常考的算法

news2025/2/27 2:29:58

一、队列介绍

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;
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何较为准确的测试自己的网速?

相对靠谱公正的20个测速网站(或APP或软件)大全&#xff08;不断更新中&#xff09; 一、电信宽带网页测速 网址&#xff1a;https://10000.gd.cn/#/speed 预览&#xff1a; 二、测速网 网址&#xff1a;测速网 - 专业测网速, 网速测试, 宽带提速, 游戏测速, 直播测速, 5G测…

Window下coturn服务器的搭建

Window下搭建coturn服务器&#xff1a; 准备材料&#xff1a; 1、安装Cygwin&#xff0c;地址&#xff1a;https://cygwin.com/install.html 由于Window无法直接部署coturn&#xff0c;因此需要下载安装Cygwin在Window上部署Linux虚拟环境。 在安装的时候需要安装几下packe…

Aigtek的ATA-7050高压放大器对比进口品牌TREK的609E-6

一、公司介绍 中国安泰&#xff1a;西安安泰电子科技有限公司是国内专业从事测量仪器研发生产和销售的高科技企业&#xff0c;公司依托西安交大、西北工业大学组建的科研团队&#xff0c;专注功率放大器、功率信号源等产品为核心的相关行业测试解决方案的研究&#xff0c;拥有国…

taro全局配置页面路由和tabBar页面跳转

有能力可以看官方文档&#xff1a;Taro 文档 页面路由配置&#xff0c;配置在app.config.ts里面的pages里&#xff1a; window用于设置小程序的状态栏、导航条、标题、窗口背景色&#xff0c;其配置项如下&#xff1a; tabBar配置&#xff1a;如果小程序是一个多 tab 应用&…

Node和Python遍历文件夹自动注入代码

需求是从文件夹中遍历检索多层级文件夹,找到其中文件取到上面namespace 后面的名称,在下面代码中自动注入动态代码: static displayName = "Test";下面使用node和python两种代码实现一下,方便对照学习 node代码 const fs = require(fs); const path = requir…

【算法|滑动窗口No.4】leetcode 485.最大连续 1 的个数 487.最大连续 1 的个数 II 1004. 最大连续1的个数 III

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

配置开启swap分区自定义大小

当前服务器swap分区是关闭状态&#xff0c;因服务需求需要开启swap分区 在 /data 目录下创建一个名为 swapfile 的文件&#xff0c;并将其大小设置为 8GB 注意这个操作占用的是/data目录的磁盘空间&#xff0c;要确保磁盘剩余空间大于设置的内存大小并且不影响磁盘空间的正常使…

10kb的WordPress外链页面安全跳转插件

老白博客我参照csdn和腾讯云的外链跳转页面&#xff0c;写了一个WordPress外链安全跳转插件&#xff1a;给网站所有第三方链接添加nofollow标签和重定向功能&#xff0c;提高网站安全性。插件包括两个样式&#xff0c;由于涉及到的css不太一样&#xff0c;所以分别写了两个版本…

测试从外包到自研再到大厂,这5年鬼知道我是怎么过来的

18岁那年我背井离乡来到从来没有来过的郑州。在一所普通的二本院校里学网络工程。 很明显&#xff0c;在大学以前只会用电脑开关机打LOL的我恍然间只觉得自己来到了人间天堂&#xff0c;没有人管&#xff0c;也没有任何烦恼无忧无虑的过了三年大学生涯。 直到秋招的开始&…

家政保洁团队服务预约小程序的效果如何

家政保洁可以是大公司也可以是小团队&#xff0c;但无论什么规格&#xff0c;其市场需求都是稳中有增&#xff0c;随着人们生活品质提升&#xff0c;其对居住环境/办公环境等都有一定要求&#xff0c;这意味着家政团队可以拓展同城乃至外地多个领域的生意。 但线下信息单一&am…

Python的web自动化学习(六)Selenium第一个网页操作

引言&#xff1a; 前面我们系统的介绍了一个各种selenium的工作原理、环境配置与准备、各种元素定位的方法&#xff0c;现在让我们一起来实践吧&#xff0c;以哔哩哔哩登录为例子说明&#xff1a; Selenium自动登录B站&#xff08;通过QQ登录&#xff09; 为什么使用qq登录&…

nodejs升级或降级

node有一个模块叫n&#xff0c;是专门用来管理node.js的版本。 升级或降级步骤 1 、安装n模块 npm install -g n 2、 升级node.js到最新稳定版 n stable Ps: n后面也可以跟随版本号&#xff08;用于升级或降级&#xff09;比如&#xff1a; n v16.12.0

白银期货投资指南,轻松搞定白银投资

在今天的金融市场中&#xff0c;白银已成为备受瞩目的投资选择。不仅如此&#xff0c;白银还是避险资产的首选之一&#xff0c;兼具保值和增值的潜力。万洲金业将为您提供一份白银期货投资指南&#xff0c;让您轻松了解白银投资&#xff0c;助力在白银交易市场获得潜在收益。 …

uniapp的启动页、开屏广告

uniapp的启动页、开屏广告 启动页配置广告开屏 启动页配置 在manifest.json文件中找到APP启动界面配置&#xff0c;可以看到有Android和iOS的启动页面的配置 &#xff0c;选择自定义启动图即可配置 广告开屏 在pages中新建一个广告开屏文件并在pases.json的最顶部配置这个页…

嵌入式应用选择正确的系统设计方法:第三部分

产品质量低下的原因有很多&#xff0c;例如&#xff0c;产品制造粗糙&#xff0c;组件设计不当&#xff0c;架构不佳以及对产品的要求了解不多。点击领取嵌入式物联网学习路线 必须设计质量。 您不能测试出足够的错误来交付高质量的产品。的质量保证&#xff08;QA&#xff09…

Collectors.toMap报错:空指针 key重复

Java 8中的stream在项目开发中被同学们用的风生水起&#xff0c;当然大家也踩了不少坑。下面我就来说说Collections.toMap在项目使用中踩的坑&#xff0c;避免大家重复被坑。 一.介绍Collectors.toMap Collectors.toMap 是 Java 8 中的一个收集器&#xff0c;它可以将流中的元…

ArrayList简介及使用全方位手把手教学(带源码),用ArrayList实现洗牌算法,3个人轮流拿牌(带全部源码)

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信你对这篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;数据结构 —— Java自定义代码实现顺序表&#xff0c;包含测试用例以及ArrayList的使用以及相关算法题(带完整源码) 目录 ArrayList简介 Arra…

Spring Security 6.1.x 系列(2)—— 基于过滤器的基础原理(一)

一、过滤器 Spring Security 的 Servlet 支持基于 Servlet 过滤器&#xff0c;因此首先了解过滤器的作用会很有帮助。 下图为单个 HTTP 请求的处理程序的典型分层。 客户端向应用程序发送一个请求&#xff0c;运行容器创建一个FilterChain&#xff08;过滤链&#xff09;&…

Thinkphp6项目在虚拟机无法指向pulic的目录访问的方法

以阿里云虚拟主机为例&#xff0c;服务器环境为 LAMP&#xff0c;Apache2.4 php7.2 mysql5.7 1.根目录新建 index.php 文件&#xff0c;将以下内容放入文件中 <?php include ./public/index.php;2.将 public 目录下的 admin.php、backend 文件夹、static 文件夹、tinymc…

UWB 技术在机器人和移动领域的应用题】

多年来&#xff0c;机器人生态系统不断增长&#xff0c;不同的应用程序也在不断增长。如今&#xff0c;机器人出现在许多不同的领域&#xff0c;例如私人家庭、商业场所、仓库和医疗场所。他们要么自主工作&#xff0c;要么与我们并肩工作&#xff0c;帮助我们完成任务。 根据…