栈和队列的面试题

本文详细介绍了如何使用栈和队列解决面试中的常见问题:1. 使用一个额外栈元素记录最小值,保持Push、Pop、Min操作时间复杂度为O(1);2. 通过两个栈模拟队列的入队和出队;3. 用两个队列实现栈的Push和Pop;4. 验证元素入栈、出栈顺序的合法性;5. 用一个数组实现两个独立的栈。每个问题都提供了具体思路和实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

对于这个问题,我们都知道,栈的入栈和出栈时间复杂度都是O(1),那么我们所面临的问题就是需要有一个接口来实现返回最小值的操作,且这个操作的时间复杂度必须是O(1)。
这里有两种思路可供选择:
(1)前提:这里有一组数据,利用一个栈,将这些数据需要入栈,而在入栈的时候遵循这样的规律,将一个数据入栈时,接下来立刻把当前栈中的最小值也入栈,接着将下一个数据入栈,也遵从上面的规律。
这种方法是一种以空间换时间的做法。

但是这种方法有一个小小的缺陷,那就是获取栈顶元素时比较尴尬,需要先将最小值出栈,然后获取栈顶元素,然后再将最小值入栈,这种方法比较麻烦。

这里写图片描述

代码如下:

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include <assert.h>
using namespace std;
#include<vector>
#include<stack>


template<class T>
class Stack
{
public:
    void Push(const T& val)
    {
        if (s.empty())
        {
            s.push(val);
            s.push(val);
        }
        else
        {
            T min = s.top();
            if (val < min)
            {
                s.push(val);
                s.push(val);
            }
            else
            {
                s.push(val);
                s.push(min);
            }
        }
    }

    void Pop()
    {
        if (!s.empty())
        {
            s.pop();
            s.pop();
        }
    }


    T Min()
    {
        if (!s.empty())
        {
            return s.top();
        }
        assert(false);
        return 0;
    }
private:
    stack<T> s;
};

(2)
利用两个栈来实现,一个栈用来保存数据,另一个栈用来保存当前数据栈中的最小值。
缺陷:min栈中会有很多冗余值。

这里写图片描述

template<class T>
class Stack
{
public:
    void Push(const T& val)
    {
        _data.push(val);
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值