C++面试:stl的栈和队列介绍

目录

栈(stack)的声明:

push(): 将元素推入栈顶

pop(): 弹出栈顶元素

top(): 访问栈顶元素,但不弹出

empty(): 检查栈是否为空 

size(): 返回栈中元素的数量 

emplace(): 在栈顶构造一个元素 

== 和 !=: 用于比较两个栈是否相等或不相等

队列

队列(queue)的声明:

push(): 将元素推入队列尾部

pop(): 从队列头部弹出元素

front(): 访问队列头部元素

back(): 访问队列尾部元素

empty(): 检查队列是否为空

总结


栈(stack)的声明:

#include <stack>// 声明一个整数类型的栈
std::stack<int> myStack;// 在栈中压入元素
myStack.push(10);
myStack.push(20);// 弹出栈顶元素
myStack.pop();// 访问栈顶元素
int topElement = myStack.top();

push(): 将元素推入栈顶

#include <stack>std::stack<int> myStack;myStack.push(10);
myStack.push(20);

pop(): 弹出栈顶元素

myStack.pop();

top(): 访问栈顶元素,但不弹出

int topElement = myStack.top();

empty(): 检查栈是否为空 

if (myStack.empty()) {// 栈为空
}

size(): 返回栈中元素的数量 

size_t stackSize = myStack.size();

emplace(): 在栈顶构造一个元素 

myStack.emplace(30);

== 和 !=: 用于比较两个栈是否相等或不相等

std::stack<int> stackA;
std::stack<int> stackB;// ...if (stackA == stackB) {// 栈A和栈B相等
}if (stackA != stackB) {// 栈A和栈B不相等
}

妙用 

逆波兰表达式计算: 使用栈来计算逆波兰表达式。运算符遇到时,弹出栈顶的操作数进行计算,并将结果重新压入栈。

// 逆波兰表达式:3 4 + 5 *
std::stack<int> st;
st.push(3);
st.push(4);
st.push(st.top() + 5);  // 3 + 4
st.pop();
int result = st.top() * 5;  // (3 + 4) * 5

括号匹配检查: 使用栈来检查表达式中的括号是否匹配。遍历表达式,遇到左括号压入栈,遇到右括号时检查栈顶是否是对应的左括号。

std::stack<char> st;
std::string expression = "((a + b) * (c - d))";
for (char c : expression) {if (c == '(') {st.push(c);} else if (c == ')') {if (st.empty() || st.top() != '(') {// 括号不匹配break;}st.pop();}
}
bool isBalanced = st.empty();

函数调用堆栈: 编程语言中的函数调用使用堆栈来保存局部变量和返回地址。当函数调用时,创建一个新的栈帧,函数执行完毕后,将栈帧弹出。

void func1() {int x = 10;// ...
}void func2() {int y = 20;// ...
}int main() {func1();func2();return 0;
}

队列

队列(queue)的声明:

#include <queue>// 声明一个整数类型的队列
std::queue<int> myQueue;// 在队列尾部插入元素
myQueue.push(30);
myQueue.push(40);// 从队列头部弹出元素
myQueue.pop();// 访问队列头部元素
int frontElement = myQueue.front();

push(): 将元素推入队列尾部

#include <queue>std::queue<int> myQueue;myQueue.push(10);
myQueue.push(20);

pop(): 从队列头部弹出元素

myQueue.pop();

front(): 访问队列头部元素

int frontElement = myQueue.front();

back(): 访问队列尾部元素

int backElement = myQueue.back();

empty(): 检查队列是否为空

if (myQueue.empty()) {// 队列为空
}

队列妙用 

广度优先搜索(BFS): 在图或树的遍历中,使用队列来实现广度优先搜索,确保按照层次遍历节点。

void BFS(Node* root) {std::queue<Node*> q;q.push(root);while (!q.empty()) {Node* current = q.front();// 处理当前节点// ...// 将当前节点的邻居节点入队for (Node* neighbor : current->neighbors) {q.push(neighbor);}// 出队q.pop();}
}

任务调度: 在操作系统或并发编程中,使用队列来管理任务队列,确保按照先进先出的原则执行任务。

#include <queue>
#include <thread>
#include <iostream>std::queue<std::function<void()>> taskQueue;
std::mutex taskQueueMutex;void workerThread() {while (true) {std::function<void()> task;{std::lock_guard<std::mutex> lock(taskQueueMutex);if (!taskQueue.empty()) {task = taskQueue.front();taskQueue.pop();}}if (task) {task();} else {// Sleep or yield to avoid busy-waitingstd::this_thread::yield();}}
}

缓存管理: 使用队列来管理缓存中的数据,确保最先进入缓存的数据最先被替换。 

#include <queue>
#include <iostream>std::queue<int> cache;void addToCache(int data) {cache.push(data);// 如果缓存大小超过限制,移除队首元素if (cache.size() > MAX_CACHE_SIZE) {cache.pop();}
}

打印任务队列: 模拟打印任务的队列,确保先提交的打印任务先得到执行。

 

#include <queue>
#include <iostream>std::queue<std::string> printQueue;void submitPrintJob(const std::string& document) {printQueue.push(document);
}void printNextJob() {if (!printQueue.empty()) {std::string document = printQueue.front();std::cout << "Printing: " << document << std::endl;printQueue.pop();}
}

总结

        栈(Stack)和队列(Queue)是两种基本的数据结构,分别以后进先出(Last-In-First-Out,LIFO)和先进先出(First-In-First-Out,FIFO)的原则组织数据。在面试中,它们常被用于解决各种问题。

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

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

相关文章

【MQ01】什么是消息队列?用哪个消息队列?

什么是消息队列&#xff1f;用哪个消息队列&#xff1f; 来了来了&#xff0c;消息队列系列总算来咯。对于搜索引擎相关的知识大家消化的怎么样呀&#xff1f;其实对于搜索引擎来说&#xff0c;我们学习的内容还是挺全面的&#xff0c;也算是比较深入了。而对于消息队列来说&am…

6.第一个Python爬虫程序

使用 Python 内置的 urllib 库获取网页的 html 信息。注意&#xff0c;urllib 库属于 Python 的标准库模块&#xff0c;无须单独安装&#xff0c;它是 Python 爬虫的常用模块 获取网页html信息 1) 获取响应对象 向百度&#xff08;百度一下&#xff0c;你就知道&#xff09;…

uniapp使用uni-forms表单校验无效

查看是否写了name属性&#xff0c;且name属性的属性值得和下面v-model绑定的一致&#xff0c;否则校验不生效 官网

一种解决常用存储设备无法被电脑识别的方法

一、通用串行总线控制器描述 通用串行总线&#xff08;Universal Serial Bus&#xff0c;简称USB&#xff09;&#xff0c;是连接电脑与设备的一种序列总线标准&#xff0c;也是一种输入输出&#xff08;I/O&#xff09;连接端口的技术规范&#xff0c;广泛应用于个人电脑和移动…

关于大模型学习中遇到的4

来源&#xff1a;网络 相关学习可查看文章&#xff1a;Transformer and Pretrain Language Models3-4​​​​​​​ 什么是MLP? MLP是多层感知器&#xff08;Multilayer Perceptron&#xff09;的缩写&#xff0c; 多层感知机&#xff08;MLP&#xff09;是一种人工神经网…

【C++】初步认识基于C的优化

C祖师爷在使用C语言时感觉到了不方便的一些点&#xff0c;于是一步一步改进优化&#xff0c;最后形成了C 本文将盘点一下基于C的语法优化 目录 命名空间&#xff1a;命名空间定义&#xff1a;命名空间使用&#xff1a; C输入&输出&#xff1a;cout&#xff1a;endl&#…

vue项目开发的完整流程

一.构建vue.js项目 1. 安装node https://nodejs.org/en/ 下载完成后&#xff0c;下一步–>下一步–>安装完成 验证node是否安装成功: 打开命令行(windows)或终端(mac),在命令行(终端)中输入&#xff1a; node -v 如果提示出版本信息则说明node安装成功 npm -v 如果提示出…

使用django-admin来做erp,是否需要使用缓存数据库

需求: 因为添加了手机字段作为加密方式存储&#xff0c; 每次管理员查看所有订单时&#xff0c;将会进行手机字段的解密&#xff0c;那么在这个时候就会消耗多几秒. 那么计划提供一个缓存数据库给django结论&#xff1a;仅仅使用django admin&#xff0c;不需要使用缓存 1&…

C语言每日一题(47)两数相加II

力扣 445 两数相加II 题目描述 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 示例1&#xff1a; 输入&#xff…

全覆盖规划算法学习笔记-------

ROS全覆盖规划算法 通过对比提供的ROS全覆盖规划算法&#xff1a;确定Boustrophedon Planner和Grid-based Local Energy Minimization Planner具备过程应用价值&#xff0c;这里选择后者进行重点研究。 参考&#xff1a; 官网 ipa_room_exploration - ROS Wiki Indoor Cover…

(2024,强化学习,扩散,奖励函数)扩散模型的大规模强化学习

Large-scale Reinforcement Learning for Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1. 使用多步骤 MDP 的策略梯度 3.2. 基于分布的奖励函…

2023 中国互联网公司 Top 100 排行榜

中国互联网协会发布了《中国互联网企业综合实力指数&#xff08;2023&#xff09;》报告&#xff0c;来源&#xff1a;https://www.isc.org.cn/article/18458024914186240.html 预览如下&#xff1a; 这份报告总结了互联网公司的排名&#xff0c;毫不意外&#xff0c;腾讯、阿里…

设计模式⑧ :管理状态

文章目录 一、前言二、Observer 模式1. 介绍2. 应用3. 总结 三、Memento 模式1. 介绍2. 应用3. 总结 四、State 模式1. 介绍2. 应用3. 总结 参考文章 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决…

MySQL常用函数解读:从基础到进阶的全方位指南

MySQL提供了丰富的函数库来满足各种数据处理需求。这些函数不仅简化了复杂的数据操作&#xff0c;还提高了数据处理的效率和准确性。 在本文中&#xff0c;我们来看一下MySQL中的一些常用函数。这些函数涵盖了字符串处理、数值计算、日期和时间操作等多个方面&#xff0c;是数据…

大势浏览器DasViewer的底图能否改为卫星底图?

支持的。官网3.2.4版本tif格式的影像图可以加进来。 DasViewer是由大势智慧自主研发的免费的实景三维模型浏览器,采用多细节层次模型逐步自适应加载技术,让用户在极低的电脑配置下,也能流畅的加载较大规模实景三维模型,提供方便快捷的数据浏览操作。 #DasViewer##实景三维##三…

写了7年代码,第一次见这么狗血的小Bug!

大家好&#xff0c;我是程序员鱼皮。 孽起 Bug 年年有&#xff0c;今年特别多。前段时间给大家分享过一个 特别坑的小 Bug&#xff0c;结果这两天我个倒霉蛋又遇到一个特别离谱的 Bug&#xff0c;有多离谱&#xff1f;大家可以看看视频&#xff1a;https://www.bilibili.com/vi…

23111 C++ day1

思维导图 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include<array>using namespace std;int main() {int a0,A0,num0,space0,other0;array<char…

前端实现转盘抽奖 - 使用 lucky-canvas 插件

目录 需求背景需求实现实现过程图片示意实现代码 页面效果lucky-canvas 插件官方文档 需求背景 要求实现转盘转动抽奖的功能&#xff1a; 只有正确率大于等于 80% 才可以进行抽奖&#xff1b;“谢谢参与”概率为 90%&#xff0c;“恭喜中奖”概率为 10%&#xff1b; 需求实现 实…

综合CRM客户管理系统

技术框架&#xff1a; JAVA MYSQL SSH 功能介绍&#xff1a; 个人工作、信息中心、客户管理、合同订单、财务管理、产品管理、人事管理以及数据回收站等8个模块。另包括权限管理模块用于系统的用户、角色和相关权限&#xff0c;收发邮件功能用于获得客户的详细需求&#xf…

GBASE南大通用的接口程序GBase ADO.NET

GBase ADO.NET 是一个提供.NET 应用程序与 GBase 数据库之间方便、高效、 安全交互的接口程序&#xff0c;使用 100%纯 C#编写&#xff0c;并继承了 Microsoft ADO.NET 类。 开发人员可以使用任何一种.NET 开发语言&#xff08;C#、VB.NET、F#&#xff09;通过 GBase ADO.NET 操…