2025年堆栈面试题及答案.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多

2025年堆栈面试题及答案

1.请简述栈(Stack)和队列(Queue)在数据结构特性上的核心差异,并举例说明各自适用的典型场景。

栈遵循LIFO(后进先出)原则,元素的插入(压栈)和删除(弹栈)仅发生在栈顶;队列遵循FIFO(先进先出)原则,元素从队尾插入(入队)、队头删除(出队)。典型差异体现在操作限制:栈的操作端点唯一,队列有两个独立端点。

栈的典型场景:函数调用栈(保存返回地址、局部变量)、浏览器后退功能(记录访问历史)、括号匹配(验证嵌套结构);队列的典型场景:任务调度(如线程池的任务队列)、消息中间件(FIFO消息传递)、BFS算法(按层遍历节点)。例如,计算表达式时,栈用于暂存未处理的操作数和运算符;而多线程环境下的日志收集,队列用于保证日志按提供顺序处理。

2.如何用数组实现一个支持动态扩容的栈?请给出关键方法的伪代码,并分析时间复杂度。

基于数组的栈需维护存储数组`elements`、栈顶指针`top`(或直接用`size`表示元素数量)。动态扩容的触发条件是当前数组已满(`size==elements.length`),此时创建新数组(通常扩容为原容量的2倍),将原数组元素复制到新数组。

关键方法:

`push(Titem)`:若栈满则扩容,`elements[size++]=item`;

`pop()`:若栈空抛异常,否则返回`elements[--size]`;

`peek()`:返回`elements[size-1]`(不修改`size`);

`isEmpty()`:返回`size==0`。

时间复杂度:`push`和`pop`的均摊时间复杂度为O(1)(扩容操作的均摊成本被均分到多次操作中),`peek`和`isEmpty`为O(1)。例如,初始容量为2,当插入第3个元素时扩容至4,复制2次元素,后续两次`push`无需扩容,均摊后每次操作的时间为O(1)。

3.设计一个双栈(两个栈)实现队列的结构,要求`enqueue`、`dequeue`、`peek`操作的均摊时间复杂度为O(1)。请说明具体实现逻辑。

使用两个栈:输入栈`pushStack`(处理入队操作)和输出栈`popStack`(处理出队操作)。

`enqueue(Titem)`:直接将元素压入`pushStack`,时间O(1);

`dequeue()`:若`popStack`为空,将`pushStack`的所有元素依次弹出并压入`popStack`(此时顺序反转),然后弹出`popStack`的栈顶元素;若`popStack`非空,直接弹出栈顶。均摊时间复杂度为O(1)(每个元素最多被压入和弹出各两次:从`pushStack`到`popStack`一次,`popStack`弹出一次);

`peek()`:与`dequeue`类似,仅返回`popStack`栈顶元素(若`popStack`空则先转移元素)。

例如,入队顺序为1、2、3,`pushStack`存储[1,2,3](栈顶为3);首次`dequeue`时,`pushStack`元素转移到`popStack`,变为[3,2,1](栈顶为1),弹出1;后续`dequeue`直接弹出`popStack`的2,无需转移。

4.给定一个只包含(、)、[、]、{、}的字符串,判断其是否有效。有效条件:左括号必须用相同类型的右括号闭合,且正确嵌套。要求用栈实现,写出关键步骤。

关键逻辑:遍历字符串,遇到左括号压栈;遇到右括号时,若栈空或栈顶左括号类型不匹配则无效,否则弹栈。遍历结束后栈必须为空。

步骤:

初始化空栈;

遍历每个字符c:

若c是左括号((,[,{),压栈;

若c是右括号:

若栈空,返回false;

弹出栈顶元素,检查是否与c匹配(如栈顶是(,c是)则匹配);

不匹配则返回false;

遍历结束,若栈非空(存在未闭合的左括号),返回false;否则返回true。

示例:字符串([)]无效。遍历到)时,栈顶是[,不匹配;字符串{[]}有效,遍历到]时栈顶是[,匹配,最后栈空。

5.逆波兰表达式(后缀表达式)求值。输入为字符串数组tokens(如[2,1,+,3,]),输出计算结果。要求用栈实现,处理可能的除零错误。

逆波兰表达式的操作符位于操作数之后,求值时用栈保存操作数,遇到操作符时弹出两个数计算,结果压栈。

步骤:

初始化空栈;

遍历每个token:

若token是数字(正/负),转换为整数压栈;

若token是操作符(+、-、、/):

弹出栈顶两个数(注意顺序:后弹出

文档评论(0)

欣欣 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档