面试中考察栈和队列的经典算法题

💝💝💝如果你对顺序表的概念与理解还存在疑惑,欢迎观看我之前的作品👉【栈和列队详解】

上篇文章👉 【面试中顺序表常考的十大题目解析】


目录

💯前言

💯栈相关题目

⭐有效的括号

⭐逆波兰表达式求值

⭐栈的压入、弹出序列

💯队列相关题目

⭐用队列实现栈

⭐用栈实现队列

💯总结


💯前言

在技术面试中,栈和队列是数据结构领域的重要考点,经常会出现各种相关的题目来考查应聘者对这两种数据结构的理解和掌握程度。以下是一些栈和队列面试中常考的题目及解析

 

💯栈相关题目

⭐有效的括号

题目链接👉【力扣】

题目描述:给定一个只包含括号 '('')''{''}''['']' 的字符串,判断字符串中的括号是否有效。有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

示例 1
输入:"()"
输出:true

示例 2
输入:"()[]{}"
输出:true

示例 3
输入:"(]"
输出:false

  

解题思路

我们可以使用来解决这个问题。遍历字符串中的每个字符,如果是左括号,就将其压入栈中。如果是右括号,就检查栈顶元素是否是对应的左括号,如果是,则弹出栈顶元素;如果不是,或者栈为空,则说明括号无效。最后,如果栈为空,则说明所有括号都匹配成功,字符串中的括号是有效的;否则,括号无效。

代码实现(C++)

class Solution {
public:bool isValid(string s) {stack<char> st;for (char c : s) {if (c == '(' || c == '[' || c == '{') {st.push(c);} else {if (st.empty()) return false;char top = st.top();if ((c == ')' && top == '(') || (c == ']' && top == '[') || (c == '}' && top == '{')) {st.pop();} else {return false;}}}return st.empty();}
};

⭐逆波兰表达式求值

题目链接👉【力扣】

题目描述:逆波兰表达式是一种后缀表达式,它将运算符放在操作数之后。例如,表达式 3 4 + 5 * 对应的中缀表达式是 (3 + 4) * 5。给定一个逆波兰表达式,求其求值结果。

示例
输入:["2", "1", "+", "3", "*"]
输出:9
解释:该逆波兰表达式的计算过程为:(2 + 1) * 3 = 9

解题思路

使用来解决这个问题。遍历逆波兰表达式中的每个元素,如果是数字,就将其转换为整数并压入栈中。如果是运算符,就从栈中弹出两个操作数,进行相应的运算,然后将结果压回栈中。最后,栈中剩下的唯一元素就是表达式的求值结果。

代码实现(C++)

class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> st;for (string token : tokens) {if (token == "+" || token == "-" || token == "*" || token == "/") {int num2 = st.top(); st.pop();int num1 = st.top(); st.pop();if (token == "+") st.push(num1 + num2);else if (token == "-") st.push(num1 - num2);else if (token == "*") st.push(num1 * num2);else st.push(num1 / num2);} else {st.push(stoi(token));}}return st.top();}
};

⭐栈的压入、弹出序列

题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 1,2,3,4,5 是某栈的压栈序列,序列 4,5,3,2,1 是该压栈序列对应的一个弹出序列,但 4,3,5,1,2 就不可能是该压栈序列的弹出序列。

解题思路

使用一个辅助栈来模拟栈的压入和弹出操作。遍历压入序列,将元素依次压入辅助栈。同时,遍历弹出序列,如果辅助栈的栈顶元素与弹出序列的当前元素相等,就将辅助栈的栈顶元素弹出,并继续比较下一个弹出元素。如果最后辅助栈为空,则说明弹出序列是可能的;否则,弹出序列是不可能的。

代码实现(C++)

class Solution {
public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {stack<int> st;int i = 0, j = 0;while (i < pushed.size()) {st.push(pushed[i++]);while (!st.empty() && st.top() == popped[j]) {st.pop();j++;}}return st.empty();}
};

💯队列相关题目

⭐用队列实现栈

题目链接👉

题目描述:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作pushtoppop 和 empty

实现思路

  1. 入栈操作(push:将元素入队到一个非空队列中(如果两个队列都为空,任选一个即可)。
  2. 出栈操作(pop:将除了最后一个元素之外的所有元素从当前非空队列依次出队并入队到另一个空队列中,然后将最后一个元素出队,这个元素就是栈顶元素。
  3. 获取栈顶元素(top:与出栈操作类似,将除了最后一个元素之外的所有元素从当前非空队列依次出队并入队到另一个空队列中,然后记录最后一个元素的值(但不出队),最后再将这个元素入队回原来的队列。
  4. 判断栈是否为空(empty:检查两个队列是否都为空。

代码实现(C++)

class MyStack {
private:queue<int> q1;queue<int> q2;public:void push(int x) {if (q1.empty()) {q2.push(x);} else {q1.push(x);}}int pop() {int element;if (q1.empty()) {while (q2.size() > 1) {q1.push(q2.front());q2.pop();}element = q2.front();q2.pop();} else {while (q1.size() > 1) {q2.push(q1.front());q1.pop();}element = q1.front();q1.pop();}return element;}int top() {int element;if (q1.empty()) {while (q2.size() > 1) {q1.push(q2.front());q2.pop();}element = q2.front();q1.push(element);q2.pop();} else {while (q1.size() > 1) {q2.push(q1.front());q1.pop();}element = q1.front();q2.push(element);q1.pop();}return element;}bool empty() {return q1.empty() && q2.empty();}
};

⭐用栈实现队列

(一)思路分析

要用栈实现队列,同样需要利用两个栈。一个栈用于入队操作(称为输入栈),另一个栈用于出队操作(称为输出栈)。当进行入队操作时,将元素直接压入输入栈。当进行出队操作时,如果输出栈为空,将输入栈中的所有元素依次弹出并压入输出栈,然后从输出栈中弹出顶部元素,这个元素就是队头元素。

(二)代码实现

  1. 结构体定义
    typedef struct {Stack *inputStack;Stack *outputStack;} QueueUsingStacks;

这里定义了一个结构体,包含两个指向栈的指针,用于实现队列的功能。


2. 初始化队列

    void initQueueUsingStacks(QueueUsingStacks *queue) {queue->inputStack = (Stack *)malloc(sizeof(Stack));queue->outputStack = (Stack *)malloc(sizeof(Stack));initStack(queue->inputStack);initStack(queue->outputStack);}

初始化时,为两个栈分配内存空间,并分别初始化它们。


3. 入队操作

    void enqueueUsingStacks(QueueUsingStacks *queue, int element) {pushStack(queue->inputStack, element);}

入队时,将元素压入输入栈


4. 出队操作

    int dequeueUsingStacks(QueueUsingStacks *queue) {int element;if (isEmptyStack(queue->outputStack)) {while (!isEmptyStack(queue->inputStack)) {pushStack(queue->outputStack, popStack(queue->inputStack));}}if (!isEmptyStack(queue->outputStack)) {element = popStack(queue->outputStack);return element;} else {printf("队列为空,无法出队\n");return -1;}}

出队时,如果输出栈为空,将输入栈中的元素转移到输出栈中,然后从输出栈中弹出顶部元素。

 

💯总结

 

通过以上对栈和队列面试常见题目的分析与解答,希望能帮助你更好地理解和掌握这两种数据结构在面试中的应用,提高你在数据结构方面的解题能力和应对面试的信心。在实际准备面试过程中,建议你多做练习,深入理解每种数据结构的特点和操作方法,以便能够灵活运用它们解决各种问题。如果你还有其他问题或需要进一步的解释,欢迎随时提问。


💝💝💝感谢你看到最后,点个赞再走吧!💝💝💝 

以下是一个投票,欢迎你参与,让我们一起了解大家对栈和队列的认知和兴趣程度: 

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

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

相关文章

【Python|接口自动化测试】使用requests库发送HTTP请求

1.requests模块介绍 Python的requests模块是一个非常流行的第三方库&#xff0c;用于发送HTTP请求。它简化了与Web服务进行交互的过程&#xff0c;使得开发人员可以更方便地处理HTTP请求和响应。 本篇文章需要对HTTP和Python有一定的了解&#xff0c;只会解释关键性的操作 安…

javascript:监听浏览器页签切换

监听页面的可见性变化&#xff0c;在很多场景下非常实用&#xff0c;比如跟踪用户行为、节省资源、优化性能等。 1 代码示例 document.addEventListener("visibilitychange", () > {if (document.visibilityState "visible") {alert("当前页面已…

VUE 开发——Node.js学习(一)

一、认识Node.js Node.js是一个跨平台JavaScript运行环境&#xff0c;使开发者可以搭建服务器端的JavaScript应用程序 使用Node.js编写服务器端程序——编写数据接口、前端工程化&#xff1b; Node.js环境没有BOM和DOM&#xff1b; Node.js安装&#xff1a;下载node-v16.19…

聚观早报 | Redmi K80 Pro电池细节;vivo X200 Pro mini真机照

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 9月30日消息 Redmi K80 Pro电池细节 vivo X200 Pro mini真机照 广汽集团正制订深化改革方案 蔚来中国获新一轮增…

敢不敢动手?AI绘画+表情包制作,7步搞定超萌表情!

在这个信息爆炸的时代&#xff0c;表情已经成为我们日常沟通中不可或缺的一部分。然而&#xff0c;过去制作个性化表情包不仅耗时费力&#xff0c;还需要掌握复杂的设计软件&#xff0c;如AE、AI、(Adobe Illustrator &#xff09;、PS。然而&#xff0c;随着AI绘画技术的兴起&…

一天学习开发一个APP!PDF转Word文档,Power Platform也能搞定

之前&#xff0c;给大家分享了微软Power Platform开发课程——手把手教你搭建二维码识别器&#xff0c;大家都很感兴趣。听说&#xff0c;很多小伙伴对于PDF转Word文档有困扰&#xff0c;这期我们继续为大家分享Power Platform的开发能力与技巧&#xff0c;怎么通过Power Platf…

hex 文件和 bin 文件剖析

目录 一、概述二、hex 文件三、bin 文件 在单片机开发中&#xff0c;hex 文件和 bin 文件是非常常见的两种烧写文件格式。比如在 Keil 中&#xff0c;编译好程序后&#xff0c;点击 Download 就可以把 hex 文件烧录到板子上。 而有时候在我们实现 IAP 时&#xff0c;有需要生成…

jmeter中token测试

案例&#xff1a; 网站&#xff1a;http://shop.duoceshi.com 讲解&#xff1a;用三个接口来讲解 第一个接口code&#xff1a;GET http://manage.duoceshi.com/auth/code 第二个登录接口&#xff1a;http://manage.duoceshi.com/auth/login 第三个接口&#xff1a;http://…

探索SpringBoot:学科竞赛管理项目开发

2 相关技术简介 2.1Java技术 Java是一种非常常用的编程语言&#xff0c;在全球编程语言排行版上总是前三。在方兴未艾的计算机技术发展历程中&#xff0c;Java的身影无处不在&#xff0c;并且拥有旺盛的生命力。Java的跨平台能力十分强大&#xff0c;只需一次编译&#xff0c;任…

fish-speech语音大模型本地部署

文章目录 fish-speech模型下载编译部署 小结 fish-speech模型 先说下fish-speech模型吧&#xff0c;可以先看下官网。如下&#xff1a; 这就是一个模型&#xff0c;可以根据一个样例声音&#xff0c;构建出自己需要的声音。其实&#xff0c;这个还是有很多用途的&#xff1b;…

产品管理- 互联网产品(5):运营知识与技能

了解运营 1、运营的基础是产品认清受众&#xff0c;切实解决问题、用户需求 2、运营活动贯穿产品的整个生命周期 3、找准用户&#xff0c;建立MVP 4、明确产品的应用场景。用户在何场景下基于何种需求使用产品&#xff1f;务必短流程 5、AARRR模型 6、运营管理流程类似产品管理…

API版本管理秒杀ApiFox的ApiFirst对比功能雏形演示

文章目录 前言第一版对比功能说明视频演示 前言 目前市面上主流的API管理工具在版本管理上&#xff0c;个人觉得做的比较粗糙&#xff0c;无法很直观的体现出版本之间差异&#xff0c;还停留在api元数据的文本比较上。用户更希望在浏览API文档阅读模式时能像word标注一样&…

Sqlserver 连接 chche 数据库详细步骤

zihao 第一步&#xff0c;安装ODBC驱动 在windows资源管理器里粘贴以下地址&#xff0c;会进入到驱动文件夹 ftp://ftp.intersystems.com/pub/cache/odbc/2018/ 第二步&#xff0c;添加ODBC 安装后&#xff0c;可能需要重启。然后打开控制面板&#xff0c;搜素ODBC&#xf…

The legacy JS API is deprecated and will be removed in Dart Sass 2.0

The legacy JS API is deprecated and will be removed in Dart Sass 2.0 更新了sass版本后&#xff0c;启动项目控制台一直在报错&#xff0c;影响开发效率&#xff0c;强迫症表示忍受不了。 字面意思是&#xff1a;Sass在2.0版本将会移除legacy JS API&#xff0c;所以现在使…

【ESP 保姆级教程】小课设篇 —— 案例:20231219_基于 ESP32 TFT显示课程表

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2024-09-30 ❤️❤️ 本篇更新记录 2023-09-30 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…

Linux命令一文速通速成

目录 嵌入式Linux的组成 Linux的介绍 Linux和发行版本 Linux应用 Linux特点 Linux发行版 GNU Linux目录结构 为什么要使用Linux命令&#xff1f; 登录 ​编辑 说明 shell是什么&#xff1f; bash shell Linux命令格式 命令格式举例 命令中的其他组成 Linux系统…

基于SpringBoot的诗词学习网站的设计与实现

目录 毕设制作流程功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行代码执行流程核心代码部分展示可行性分析软件测试详细视频演示源码获取 毕设制作流程 &#xff08;1&#xff09;与指导老师确定系统主要功能&#xff1b; &#xff08;2&am…

fastAPI教程:路由操作及HTTP请求响应

FastAPI 三、路由操作 3.1 路由装饰器 路由装饰器&#xff0c;也叫路径操作装饰器。 FastAPI提供了一系列基于HTTP请求作为方法名的装饰器给开发者用于绑定url地址提供给外界操作API接口。 HTTP方法FastAPI代码描述GETapp.get()async 方法名(): pass获取数据POSTapp.post(…

python15_转换为ASCII

转换为ASCII A A B 你好 C 66def str_to_ascii(s):# 如果输入是单个字符&#xff0c;直接返回其ASCII值if len(s) 1:return ord(s)# 否则返回每个字符的ASCII值列表return [ord(char) for char in s]def int_to_ascii(i):# 将整数转换为对应的ASCII字符return chr(i)if __…

光储一体化在停车场中的应用

近年来&#xff0c;光伏作为一种绿色环保无污染的可再生能源在中国的发展迅速。据统计&#xff0c;2022 全年光伏发电量为 4276 亿千瓦时,同比增长 30.8%,约占全国全年总发电量的 4.9%。然而&#xff0c;光伏发电也存在着不稳定性的问题&#xff0c;因此储能技术的发展成为克服…