数据结构—栈和队列经典面试题

本文详细探讨了如何使用栈和队列解决经典面试题,包括用两个栈实现队列、两个队列实现栈、在O(1)时间复杂度下获取栈中最小值,以及如何判断入栈和出栈序列的合法性。文中提供了不同的解决方案和代码实现,强调了空间利用和时间效率的重要性。
摘要由CSDN通过智能技术生成

栈和队列面试题:

  • 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)
  • 使用两个栈实现一个队列
  • 使用两个队列实现一个栈
  • 元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为 (4,5,3,2,1)
  • 一个数组实现两个栈(共享栈)

实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1) 

问题分析:栈的入栈操作和出栈操作时间复杂度本来就是O(1),所以这道题目的关键点在于如何处理才能做到返回栈中最小值时的时间复杂度也为O(1)

方法一:用一个栈

入栈:第一个元素入栈时(当前栈为空),push 两次第一个数据,第一次 push 的数据代表当前入栈的数据,第二次 push 的数据代表当前栈中最小的元素;第二个元素入栈时,先将该数据与当前栈顶的数据进行比较并记录下二者当中较小的数据,然后 push 第二个数据,接个 push 比较后记录的较小的那个数据(该数据就是当前栈中的最小值);后面入栈的数据做同样的处理

出栈:出栈时需 pop 两次,第一次 pop 的结果是当前栈中最小的元素,第二次 pop 的结果是真真意义上的栈顶元素

取最小值:当前栈顶的元素就是栈中所有元素的最小值

说明:方式一下的栈接口与普通的栈接口一模一样,这里的代码前一篇博客已经实现了,可以参考:数据结构—栈

方式二:用两个栈

入栈:第一个元素入栈时(栈为空),栈 S1和S2 中都 push 第一个数据,栈S1中的数据代表当前入栈的数据,栈S2中的数据代表当前栈中最小的数据;第二个数据入栈时(假设栈不为空),栈S1中直接 push 第二个数据,然后比较第二个数据和S2栈顶的数据并记录下较小的那个数据,将记录下的较小值 push 到S2中作为当前栈中最小的数据;后面入栈的数据做同样的处理

出栈:同时 pop 栈S1和S2,栈S1进行 pop 的结果是删除当前栈顶的元素,栈S2进行 pop 的结果是更新了栈中的最小元素记录

取最小值:栈S2栈顶的元素就是当前所有元素中的最小值

结构的定义:

typedef struct MinStack  //最小值栈
{
         Stack _s1;  //存数据
         Stack _s2;  //存当前栈中数据的最小值

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值