《剑指offer》------栈/队列专题

基于STM32L4XX、HAL库的ICP-10111压力传感器驱动程序设计 define ICP10111_CMD_MEAS_ULN 0x7866 // 超低噪声模式。#define ICP10111_CMD_MEAS_LP 0x609C // 低功耗模式。#define ICP10111_CMD_MEAS_LN 0x70DF // 低噪声模式。#define ICP10111_CMD_MEAS_N 0x6825 // 正常模式。ICP10111_MODE_LN, // 低噪声。// 等待测量完成(根据模式不同等待时间不同) 阅读详情


用两个栈实现队列

//需要考虑S2是否为空  
import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    //队列的压入就是s1的压入数据  
    public void push(int node) {
        stack1.push(node);
    }
    
    //弹出借助于S1/s2 两个   弹出需要考虑队列是否为空
    public int pop() {
        if(size()!=0){
            if(stack2.empty()){                //若s2为空  则需要把s1的元素全部压入s2再输出
                while(!stack1.empty())
                    stack2.push(stack1.pop());
            }
            return stack2.pop();               //若s2不为空 则直接输出
        }else{
            System.out.println("队列为空,不能执行出队操作");
            return -1;
        }
    }
    //队列的大小  队列为空则说明 s1/s2均为空
    public int size(){
        return stack1.size()+stack2.size();
    }
}



用两个队列实现一个栈





import java.util.*;
/**
 * 使用LinkedList表示队列    所以队列从尾入队  q1.addLast(e)   从头出队q1.removeFirst()
 * @author 多多
 *
 * @param <E>
 */
public class MyStack<E> {
	LinkedList<E>  q1=new LinkedList<E>();    //队列1
	LinkedList<E>  q2=new LinkedList<E>();    //队列2
	
	//入栈操作 即入队
	public void push(E e) {
		q1.addLast(e);    //从尾部入队
	}
	
	//出栈操作:  非空队列的n-1个压入空队列  剩余的第n个出队   总有一个队列为空
	public E pop() {
		if(size()!=0) {                              //判断栈是否为空
			if(!q1.isEmpty()) {
				putN_1ToAnother();           //非空队列的n-1个压入空队列
				return q1.removeFirst();     //剩余的第n个出队 (从对头出队)
			}else {
				putN_1ToAnother(); 
				return q2.removeFirst(); 
			}
		}else {
			System.out.println("栈为空,无法执行出栈操作");
			return null;
		}
	}
	
	// 非空队列的n-1个压入空队列
	private void putN_1ToAnother() {
		if(!q1.isEmpty()) {               //若q2为空 则从q1中移动前n-1个
			while(q1.size()>1) {  
				q2.addLast(q1.removeFirst());
			}
		}else {
			while(q2.size()>1) {      //若q1为空 则从q2中移动前n-1个
				q1.addLast(q2.removeFirst());
			}
		}
	}

	//判断栈是否为空
	public int size() {
		return q1.size()+q2.size();
	}
}







包含min函数的栈



方法1: 每次都存入

import java.util.Stack;
 
public class Solution {
 
    private Stack<Integer> stackDate;
    private Stack<Integer> stackMin;
     
    public Solution(){
        stackDate = new Stack<>();
        stackMin = new Stack<>();
    }
    public void push(int node) {
        stackDate.push(node);
        if(stackMin.isEmpty()){
            stackMin.push(node);
        }else if(node <= stackMin.peek()){
            stackMin.push(node);
        }
    }
     
    public void pop() {
         if(stackDate.isEmpty()){
            throw new RuntimeException("This stack is empty!");
         }
         if(stackDate.peek() == stackMin.peek()){
             stackMin.pop();
         }
         stackDate.pop();
    }
     
    public int top() {
        if(stackDate.isEmpty()){
            throw new RuntimeException("This stack is empty!");
         }
        int value = stackDate.pop();
         if(value == stackMin.peek()){
             stackMin.pop();
         }
        return value;
    }
     
    public int min() {
        if(stackMin.isEmpty()){
            throw new RuntimeException("This stack is empty!");
        }else{
            return stackMin.peek();
        }
    }
}

方法2:只存入比之前小的元素

import java.util.Stack;
 
public class Solution {
 
    private Stack<Integer> stackDate;
    private Stack<Integer> stackMin;
     
    public Solution(){
        stackDate = new Stack<Integer>();
        stackMin = new Stack<Integer>();
    }
    public void push(int node) {
        stackDate.push(node);
        if(stackMin.isEmpty()){
            stackMin.push(node);
        }else if(node <= stackMin.peek()){
            stackMin.push(node);
        }
    }
     
    public void pop() {
         if(stackDate.empty()){
            throw new RuntimeException("This stack is empty!");
         }
         if(stackDate.peek() == stackMin.peek()){   //相同则一起弹出
             stackMin.pop();
         }
         stackDate.pop();     //否则只是弹出数据栈
    }
     
    public int top() {        //获取栈顶元素
        if(stackDate.isEmpty()){
            throw new RuntimeException("This stack is empty!");
         }
        int value = stackDate.pop();
         if(value == stackMin.peek()){
             stackMin.pop();
         }
        return value;
    }
     
    public int min() {
        if(stackMin.isEmpty()){
            throw new RuntimeException("This stack is empty!");
        }else{
            return stackMin.peek();
        }
    }
}






栈的压入 ,弹出序列





方法1:   Stack结构辅助

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        if(pushA.length==0 || popA.length==0|| pushA.length!=popA.length)
            return false;
      
        Stack<Integer> s=new Stack<Integer>();
        int index=0;                       //pop数组的下标
        for(int i=0;i<pushA.length;i++){
            s.push(pushA[i]);            //压入元素
            //判断  当s非空 且栈顶元素等于pop[index]时则弹出
            while(!s.empty() && s.peek()==popA[index]){
                s.pop();
                index++;
            }
        }
        
        return s.empty();               //正常则全部弹出 为空 否则为不正确的输出序列
    }
}
//注意一个地方:
while(index<popA.length && s.peek()==popA[index]){    //这个就是防止两个数组均对应输出完毕 出现栈为空 却要弹出的情况
                s.pop();
                index++;
            }





滑动窗口的最大值:

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。


方法1 :时间O(n2)              两个for截取特定区间比较储存  
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        //采用时间复杂度为O(n2)的笨办法
        ArrayList<Integer> list=new ArrayList<Integer>();
        if(num==null || num.length==0 || size<=0 || size> num.length)
            return list;
        int len=num.length;
        for(int i=0;i<len-size+1;i++){
            int max=Integer.MIN_VALUE;
            for(int j=i;j< i+size; j++){    //注意这个区间截取范围
                if(max< num[j])
                    max=num[j];
            }
            list.add(max);
        }
        return list;
    }
}
方法2 :时间O(n)   空间O(n)    采用队列的思想

import java.util.*;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer> list=new ArrayList<Integer>();
        if(num==null || num.length==0 || size<=0 || size> num.length)
            return list;
        int len=num.length;
        //采用队列的思想 入队一个出队一个
        Queue<Integer>  q=new LinkedList<Integer>();
        int max=Integer.MIN_VALUE;
        //对于前size个元素  直接一次入队列
        for(int i=0;i<size;i++){
            q.add(num[i]);
            if(max <num[i])
                max=num[i];
        }
        list.add(max);
        //之后每次弹出一个 就进入一个 并在其中取最大值
        for(int i=size;i<len;i++){
            q.poll();
            q.add(num[i]);
            max=Integer.MIN_VALUE;
            for(Integer n: q){
                if(max< n)
                    max=n;
            }
            list.add(max);
        }
        return list;
    }
}


方法3 :时间,空间均为O(n)   采用“双端队列”的思想
原则:
 *     对新来的元素k,将其与双端队列中的元素相比较
 *     1)前面比k小的,直接移出队列(因为不再可能成为后面滑动窗口的最大值了!),
 *     2)前面比k大的X,比较两者下标,判断X是否已不在窗口之内,不在了,直接移出队列
 *     队列的第一个元素是滑动窗口中的最大值


import java.util.*;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer> list=new ArrayList<Integer>();
        if(num==null || num.length==0 || size<=0 || size> num.length)
            return list;
        int len=num.length;
        //采用队列的思想 入队一个出队一个
        LinkedList<Integer>  q=new LinkedList<Integer>();  //队列存储的是下标
        for(int i=0;i<len;i++){   
            //从后面依次弹出队列中比当前num值小的元素 则当前队列首元素即为当前窗口的最大值
            while(!q.isEmpty() && num[q.peekLast()]<= num[i]){     //注意队列不为空的判断!!因为第一次是没有元素的,会主动跳过两个判断
                q.pollLast();
            }
            //当前窗口首元素位置移出当前窗口 则删除首元素
            while(!q.isEmpty() && i-q.peekFirst()>size-1){
                q.pollFirst();
            }
            q.addLast(i);    //将每一个num值入队
            if(size!=0 && i>=size-1){        //当i >=size-1时才开始写入窗口最大值
                list.add(num[q.peekFirst()]);
            }
        }
        return list;
    }
}  

2024届数字IC秋招-华为机试-数字芯片-笔试真题和答案(五)(含2022年和2023年) 此部分包含华为机试真题,方向是数字芯片,内容详细包括设计、验证、后端等,大部分题目给出参考答案。华为机试都是从题库里抽题目,所以这些题目还是很有参考性的,甚至是完全一样,可以搜到的。(题目内容较多,将分开编写几个文章) 阅读详情

相关推荐

磁编码器选型避坑指南:为什么MT6816比霍尔传感器更适合你的伺服系统?

本文深入对比了MT6816磁编码器与传统霍尔传感器在伺服系统中的应用。MT6816基于AMR技术,对磁场方向敏感而非强度,具备高精度、强抗干扰、高安装容差和极低延时等优势,尤其适合高转速、恶劣环境下的工业场景,能有效提升系统可靠性与长期稳定性。

rainy的博客 1104

【剑指offer】队列的最大值(队列)

题目描述 定义一个队列并实现函数max得到队列里的最大值,要求函数max、push_back和pop_front的时间复杂度都是O(1) 思路 实现带max函数的队列;使用双头队列实现。 总共使用2个队列,一个队列用来存储正常的队列元素,另一个双头队列用来存储可能成为最大值的元素,其中双头队列的队列头表示当前队列的最大值,O(1)时间得到。 (1)每次加入一个新元素,从双头队列中从后往前找,删除比...

zjwreal 674

Silvaco Atlas(五)——物理模型总结

物理模型总结

qsz1425AWD2121的博客 2152

剑指Offer-栈和队列-(1)

数据结构:栈 ,队列。 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。 思路:这道题的意图是要求我们操作这两个“先进后出”的栈实现一个“先进先出”队列。 需要两个功能:进队和出队。 进队:直接在队尾增加元素(相当于执行进栈操作) 出队:利用两个栈来完成,先全部进入栈A中,然后出栈全部进入到栈B中,然后在再出栈(这样就模拟了出栈功能)。如果出栈都完成,继...

qq_35649064的博客 162

处理SAP资产折旧AFAB 过账报错:“科目 8019010100 要求一个成本会计分配”

本文介绍如何处理资产折旧报错 ““科目XXXXXXX 要求一个成本会计分配””

IT小职员 2777

水文地质人必备:用Origin Pro 2023手把手教你搞定Piper三线图(附数据模板)

本文详细介绍了如何使用Origin Pro 2023绘制专业级Piper三线图,适用于水文地质数据分析。从数据准备、百分比计算到图表参数设置,提供全流程指导,并附赠数据模板和样式预设文件,帮助用户快速掌握这一水文地球化学分析的核心工具。

weixin_30568591的博客 533

剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。 我们通过一个具体的例子来分析该队列插入和删除元素的过程。首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},stack2为空。再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有

D.K专栏 8746

【AUTOSAR SystemServices】AUTOSAR CP中Watchdog Manager模块技术解析

本文深入解析了AUTOSAR中的Watchdog Manager模块实现。该模块通过多层次监督机制(Alive/Deadline/Logical Supervision)确保系统安全运行,具备动态模式切换和分级故障处理能力。 关键实现包括: 数据结构设计:包含监督实体状态结构体(实时状态维护)、监督配置结构体(支持模式切换)和全局状态信息(系统级监控) 核心流程优化:初始化采用事务性设计,检查点处理通过条件编译优化,主监控循环采用流水线式并行处理 监督机制实现:Alive监督采用滑动窗口算法,Deadlin

1039

如何5分钟上手claude-ads:从零安装到运行 /ads 第一条命令的完整指南

**claude-ads** 是一个面向 Claude Code 的开源付费广告投放技能(Skill)工具包,覆盖 Google、Meta、YouTube、LinkedIn、TikTok、Microsoft、Apple、Amazon、Reddit、Pinterest、Snapchat、X 共 **12 个广告平台**。它能把你的授权账户导出文件或账户数据,变成有证据支撑的广告账户审计、预算规划、素

gitblog_00670的博客 973

2025年最新自动化/控制保研夏令营&预推免面试真题分享(东南/浙大/华科清华)

笔者来2021级本科自动化专业,以下部分将介绍我在夏令营以及预推免期间发生经历和问题。

Control Everything 2646

将Keil中的变量数组导出

首先,写好导出数据的函数。

小柚子的博客 1952

牛客网《剑指offer》专栏刷题练习|锻炼递归思想|练习栈的使用

🔥前言 书接上文,今天继续分享牛客网中的经典好题。那么今天带来两道简单题,用到了递归和栈的知识,我做完之后感觉神清气爽啊。刷题入口放在文章开头了,点击注册即可,那么快来跟我一起刷题练习吧!...

叶落秋白的博客 1357

从一只龙虾到一支团队:OpenClaw 单 Bot 多 Agent 配置实践

单 Bot 多 Agent只有一个对外的聊天入口(飞书 Bot)内部有多个独立的 AI Agent,各司其职主 Agent(总指挥)负责接收任务并分配给子 Agent子 Agent 完成任务后将结果返回给主 Agent角色Agent ID职责使用场景🎯 总指挥main-agent统筹协调,任务分发接收所有用户请求✍️ 笔杆子内容创作公众号、博客、小红书🔬 参谋canmou深度研究竞品分析、市场调研📋 运营官operations运营管理邮件、日历、社交媒体。

Maynor的博客 1082

剑指 Offer 总结 - leetcode 剑指offer系列

剑指 Offer 系列完结撒花!! ???????? 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写这个系列耗费了我不少精力, 不过我也很开心能和大家分享, 真心希望能对大家有所帮助, 也希望大家能够多多点赞转发和分享, 让更多人看到, 谢谢~ 接下来我需要休整一段时间来准备新的系列了, 中间也可能会有一些不定期更新. 至于新系列是什么呢? 大家敬请期待 ???? P.S.

随便发挥的博客 3569

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【剑指offer】学习计划day1

本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下链接:剑指offer-学习计划本期是本系列的day1,话不多说,让我们来看看今天的主题----》栈与队列(简单)题目:JZ09:用两个栈实现队列,JZ30:包含min函数的栈。

忆梦初心的博客 1154

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

剑指offer——栈和队列

目录 剑指Offer(五):用两个栈实现队列 题目 1、思路 2、代码 剑指Offer(二十):包含min函数的栈 题目 1、思路 2、代码 剑指Offer(二十一):栈的压入、弹出序列 题目 1、思路 2、代码 剑指Offer(五):用两个栈实现队列 题目 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 1、思路 ...

qq_40088702的博客 356

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LeetCode 剑指 Offer II 排序 专题总结

输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]输入:intervals = [[1,3],[2,6],[8,10],[15,18]]请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].输出:[2,2,2,1,4,3,3,9,6,7,19]输出:[[1,6],[8,10],[15,18]]输入: [3,2,1,5,6,4] 和 k = 2。

2501_90404671的博客 670

剑指Offer题解——栈和队列

文章目录剑指 Offer 09. 用两个栈实现队列解法剑指 Offer 30. 包含min函数的栈解法剑指 Offer 59 - I. 滑动窗口的最大值双端队列剑指 Offer 59 - II. 队列的最大值解法剑指 Offer 11. 旋转数组的最小数字二分查找推荐阅读 剑指 Offer 09. 用两个栈实现队列 剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除

wardseptember的博客 551

剑指offer栈、队列、位运算题目汇总(面试必备)

剑指 offer 栈、队列题目汇总(C++版)   1、用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 返回 -1 ) 思路:我们知道队列特点是先进先出,而栈的特点是先进后出。因此我们使用栈1来存储数据,栈2来模拟队列弹出数据。栈2如果为空,就需要把栈1的数据全都 push 过来,否则如果栈2不为空,取出栈顶元素即可。

Destiny_shine的博客 4995

剑指Offer #05 用两个栈实现队列(模拟)

题目来源:牛客网-剑指Offer专题 题目地址:用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 题目解析 首先,我们需要知道一下基本知识: 栈(stack)是一种操作受限制的线性表,限定仅在表尾进行插入和删除操作的线性表,具有有“先进后出”的特性。 队列(queue)也是一种操作受限制的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,具有“先进先出”的特性。 题目就是想让我们用两个“后进先出”的数据结构,来实现一个“

Veggie的博客 1万+

剑指offer

本习题集用于记录一些剑指offer的习题,用于记录和复盘思路,会持续更新

保持学习 1256

【剑指Offer】面试题:栈和队列

剑指Offer中一共有4道关于栈和队列的面试题 面试题9:用两个栈来实现队列 题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 JS实现:【剑指Offer】面试题9:用两个栈实现队列——JS实现 面试题30:包含min函数的栈 题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数。在该栈中,调用min、push...

Dora_5537的博客 406

剑指offer9 用两个栈实现队列

剑指offer8-AcWing-20. 二叉树的下一个节点 请用栈实现一个队列,支持如下四种操作: push(x) – 将元素x插到队尾; pop() – 将队首的元素弹出,并返回该元素; peek() – 返回队首元素; empty() – 返回队列是否为空; 注意: 你只能使用栈的标准操作:push to top,peek/pop from top, size 和 is empty; 如果你...

WangXu__的博客 214

Python剑指offer之两个栈实现一个队列-两个队列实现一个栈

栈与队列之间的相互实现,是面试中的经典试题。 两个栈实现一个队列 入队:元素进栈A 出队:先判断栈B是否为空,为空则将栈A中的元素 pop 出来并 push 进栈B,再栈B出栈,如不为空则栈B直接出栈 复杂度分析: 这样用两个栈实现一个队列,入队的复杂度为O(1),出队的复杂度则变为O(n)。 而直接用 python 的单个列表实现队列,以列表首作为队列尾,则入队用insert,复...

海晨威 1万+

剑指offer刷题总结——堆、栈、队列篇

1.用两个栈实现队列 【题目】 用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 队列中的元素为 int 类型。 【代码】 package swear2offer.construction; import java.util.Stack; public class StackToQueue { /** * 用两个栈来实现一个队列,完成队列的 Push 和 P...

程序员世杰 703

剑指offer 09、30:栈与队列

详解栈与队列;剑指offer 09和30题解析

qq_46056318的博客 6256
上一篇: 《剑指offer》---单例模式专题(5种)
下一篇: 《剑指offer》------树专题
duoduo18up
博客等级 码龄10年 111粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值