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

时间:2024-10-12 07:30:53

栈和队列面试题:

  • 实现一个栈,要求实现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;  //存当前栈中数据的最小值