《栈与队列:数据结构的“双生花”》

发布时间:2026/9/29 2:19:10

《栈与队列:数据结构的“双生花”》 《栈与队列数据结构的“双生花”》一.栈:后进先出1.1认识栈这一章的栈和队列比较简单;1.2后进先出1.3基于数组的栈模拟①.入栈②.出栈③.取栈顶元素二.队列:先进先出2.1认识队列注意:队列他是接口,接口,接口!2.2队列图解2.3 以数组模拟队列①入队列②.出队列③.取队首元素2.4以链表模拟队列①入队列②出队列③取队首元素三.栈和队列题目1. 括号匹配2. 逆波兰表达式求值3. 出栈入栈次序匹配4. 最小栈四.面试题1. 用队列实现栈。2. 用栈实现队列。一.栈:后进先出1.1认识栈这一章的栈和队列比较简单;首先是:后进先出的栈我们可以把栈理解为简化版的顺序表,他最主要的就是三个操作:①入栈------尾插②出栈------尾删③取栈顶元素栈的方法:入栈:push();出栈:pop();取栈顶元素:peek();1.2后进先出后进先出,这个不难理解,就是后入栈的元素,进行出栈或者取栈顶元素时,先处来,俗话说枪打出头鸟,后来者机会大,这就是后进先出;代码演示://实例化栈StackIntegerstacknewStack();//注意这种引用类型存储的变量要写成包装类型;//入栈stack.push(1);stack.push(2);stack.push(3);stack.push(4);//出栈intastack.pop();//这里是4;System.out.println(a);//4//取栈顶元素System.out.println(stack.peek());//这里是31.3基于数组的栈模拟①.入栈classMyArrayStack{//首先创集一个数组privateint[]data;privateintsize;publicMyArrayStack(intsize){this.datanewint[size];}publicMyArrayStack(){this.datanewint[10];}privatevoidgrow(){int[]Edatanewint[2*data.length];for(inti0;idata.length;i){Edata[i]data[i];}dataEdata;}//入栈模拟publicvoidpush(intval){if(data.lengthsize){grow();}data[size]val;size;}}②.出栈publicintpop(){if(size0)thrownewRuntimeException(栈为空);//size先减减,扩容减一,然后返回栈顶元素returndata[--size];}③.取栈顶元素publicintpeek(){if(size0)thrownewRuntimeException(栈为空);returndata[size-1];}二.队列:先进先出2.1认识队列队列与栈不同,他是先进先出,也就是先入队列的元素先出来,后来的慢慢排队,这个在我们日常生活中是很常见的,比如排队吃饭,肯定是先排在前面的先吃到饭,后排的后吃饭;队列方法:注意:队列他是接口,接口,接口!这里我只说链表实现了这个接口,这是最常见,最常用的的向上转型,其他的以后再说;//用链表的向上转型QueueIntegerqueuenewLinkedList();queue.offer(1);queue.offer(2);queue.offer(3);intbqueue.poll();//1System.out.println(b);//打印出先进去的12.2队列图解队列我们也是要掌握三种基本操作:入队列,出队列,取队首元素;入队列-----尾插出队列-----头删取队首元素2.3 以数组模拟队列这里我们用不一样的方法,之前我们在写入栈方法时,他是属于动态内存,用完了,可以直接继续不断地扩容,这次我们用固定数组首先创建头标head,尾标tail;publicclassMyArrayQueue{publicint[]data;publicinthead0;publicinttail0;publicintsize0;publicMyArrayQueue(intcount){this.datanewint[count];}publicMyArrayQueue(){this.datanewint[10];}}①入队列publicvoidoffer(intval){if(sizedata.length){return;//直接结束}if(taildata.length){tail0;}data[tail]val;size;}②.出队列publicIntegerpoll(){if(size0){returnnull;}intresdata[head];head;if(headdata.length){head0;}size--;returnres;}③.取队首元素publicIntegerpeek(){if(size0){returnnull;}returndata[head];}2.4以链表模拟队列首先创建链表节点;classELinkedNode{publicintval;publicELinkedNodenext;publicELinkedNode(intval){this.valval;this.nextnull;}}①入队列publicclassMyLinkedQueue{ELinkedNodeheadnull;ELinkedNodetailnull;publicvoidoffer(intval){ELinkedNodenewNodenewELinkedNode(val);if(headnull){tailnewNode;headnewNode;return;}tail.nextnewNode;tailtail.next;}}②出队列publicIntegerpoll(){if(headnull){returnnull;}ELinkedNodecurhead;headhead.next;returncur.val;}③取队首元素publicIntegerpeek(){if(headnull){returnnull;}returnhead.val;}三.栈和队列题目1. 括号匹配括号匹配题目分析1).首先判断符号十分时左括号,如果说,直接入栈2).还需要判断是否右括号,不然直接返回false;3).最后依次出栈与右括号比较是否配对4)返回栈是否为空.为空左右括号都匹配到了publicbooleanisMatch(charstr1,charstr2){if(str1(str2)){returntrue;}if(str1[str2]){returntrue;}if(str1{str2}){returntrue;}returnfalse;}publicbooleanisValid(Strings){StackCharacterstacknewStack();for(inti0;is.length();i){charchs.charAt(i);if(ch(||ch[||ch{){stack.push(ch);continue;}if(ch!)ch!}ch!]){returnfalse;}if(stack.empty()){returnfalse;}charstrstack.peek();if(isMatch(str,ch)){stack.pop();continue;}returnfalse;}returnstack.empty();}2. 逆波兰表达式求值逆波兰表达式求值题目解析1.首先判断是否为数字如果是直接入栈2.数字和符号都不是continue,这个题其实不用考虑但我们还是要写全部3).接着判断是加减乘除拿出两个元素进行计算publicbooleanisnumber(Stringstr){if(str.equals()||str.equals(-)||str.equals(*)||str.equals(/)){returnfalse;}returntrue;}publicintevalRPN(String[]tokens){StackIntegerstacknewStack();for(Stringstr:tokens){if(isnumber(str)){stack.push(Integer.parseInt(str));continue;}if(!stack.empty()){intres0;intbstack.pop();intastack.pop();if(str.equals()){resab;}if(str.equals(-)){resa-b;}if(str.equals(*)){resa*b;}if(str.equals(/)){resa/b;}stack.push(res);}}returnstack.pop();}3. 出栈入栈次序匹配栈的压入、弹出序列题目解析1.创建一个栈原来入栈2遍历入栈数组先入栈循环判断是否不为空3.如果相等直接出栈出栈数组往后遍历加14.如果不相等直接结束此次循环5.返回栈是否为空publicbooleanIsPopOrder(int[]pushV,int[]popV){// write code hereStackIntegerstacknewStack();intsizepushV0;intsizepopV0;for(;sizepushVpushV.length;sizepushV){stack.push(pushV[sizepushV]);while(!stack.empty()){if(stack.peek()popV[sizepopV]){stack.pop();sizepopV;}else{break;}}}returnstack.empty();}4. 最小栈最小栈可以看到给了一个构造方法用来初始化,然后四个操作方法;题目解析:1)首先定义两个栈 ,一个用来正常存储原数据,一个用来存储最小元素的栈publicMinStack(){privateStackIntegerstacknewStack();privateStackIntegerminstacknewStack();}2)判断,数值每次存储在satack,如果最小栈为空,存储value;不断比较min最小值来更新,最后入栈minpublicvoidpush(intvalue){stack.push(value);if(minstack.empty()){minstack.push(value);return;}intminminstack.peek();if(valuemin){minvalue;}else{minmin;}minstack.push(min);}3)出栈publicvoidpop(){stack.pop();minstack.pop();}4)取栈顶元素publicinttop(){returnstack.peek();}5)取最下栈顶元素publicintgetMin(){returnminstack.peek();}四.面试题1. 用队列实现栈。用队列实现栈1).首先关键是出栈和去栈;2).我们需要准备两个队列,一个用来存储元素,当出栈时,将A中的元素不断循环遍历倒腾到B,只剩一个元素就可以出栈了,达到了栈的出栈;3)取栈顶元素与出栈差不多,只不过多加了一个把最后一个元素还是要倒腾到B中;classMyStack{publicQueueIntegerAnewLinkedList();publicQueueIntegerBnewLinkedList();publicMyStack(){}publicbooleanempty(){returnA.isEmpty()B.isEmpty();}publicvoidswapAB(){QueueIntegertempnewLinkedList();tempA;AB;Btemp;}publicvoidpush(intx){A.offer(x);}publicintpop(){if(empty()){return0;}while(A.size()1){IntegercurA.poll();B.offer(cur);}IntegerresA.poll();swapAB();returnres;}publicinttop(){if(empty()){return0;}while(A.size()1){IntegercurA.poll();B.offer(cur);}IntegerresA.poll();B.offer(res);swapAB();returnres;}}2. 用栈实现队列。用栈实现队列题目解析:1)首先创建两个栈,A用来入队列,B用来出队列;2)检查B是否为空,如果不为空,首先将B的元素倒腾到A里面去,然后再对A进行入栈操作;3)出栈时遵循后进先出,依次将A中的元素入到B中,B中采用后进先出,此时就达到队列的作用
延伸阅读

更多相关文章

2026/9/29 2:19:10

PPT Master:如何把一份文档变成原生可编辑的 PPT

PPT Master:如何把一份文档变成原生可编辑的 PPT 【免费下载链接】ppt-master AI turns documents or topics into real, native PowerPoint decks—with native shapes, transitions and animations, data-backed charts and tables on demand, audio narration fr…

2026/9/29 3:14:12

StarNet深度学习去星:深空摄影后期星点分离实战指南

1. 先聊聊StarNet到底是干什么的从我开始拍深空照片那天起,就一直在跟一个老问题较劲:恒星永远挡在星云前面。拍摄猎户座大星云 M42 的时候,核心区域那几颗亮星周围一圈圈衍射芒,怎么看怎么碍眼。拍面纱星云的时候,暗弱…

2026/9/29 3:14:12

基于Dify的AI复盘工作流:从散乱文本到结构化报告

前阵子整理自己手头的项目复盘材料、客服聊天记录和用户反馈时,我意识到一个问题:每次想认真回顾一件事,最后都变成“当时要是……就好了”。这种状态特别典型——事后看全是正确答案,但当时没人看见。这正是英语里的 hindsight&a…

2026/9/29 3:14:12

基于Go的GaussDB只读MCP服务:为Claude Code构建安全数据查询通道

1. 为什么我要给 Claude Code 配一个只读的 GaussDB 通道先说结论:我写了一个用 Go 实现的 MCP 服务,把 GaussDB 的查询能力以只读方式暴露给 Claude Code。它解决的核心问题是——我想让 AI 帮我查数据、写 SQL、分析表结构,但绝对不能让它在…

2026/9/29 3:14:12

复杂系统数字孪生:从可视化大屏到智能仿真引擎的跃迁

简介:一份关于复杂系统数字孪生的Word文档,面向工业互联网、智能制造领域的研究者与工程师,系统梳理了数字孪生从单元级到系统级的演进路径,并围绕GE智能电厂IGCC场景解析典型应用。内容覆盖产品生命周期各阶段孪生模型的融合、P-…

2026/9/29 3:14:12

智能硬件四维协同:板卡、固件、云端、App的契约化开发实践

1. 为什么智能硬件项目总在“最后一公里”集体失速?“板卡还没回厂,固件还在debug,云端API刚跑通,App提测被拒三次”——这几乎是我过去八年带过的23个智能硬件项目里,90%以上团队在Q3末期脱口而出的原话。不是没人加班…

2026/9/29 3:09:11

GLSL语法规范深度拆解:从BNF到Shader编译错误排查

说一下我对这个标题的直觉。很多OpenGL开发者,写了几年shader,GLSL代码能跑能出画面,但很少人真正翻开过规范最后那几十页——OpenGL Shading Language Specification里的Shading Language Grammar,也就是GLSL的语法规范英文原版。…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑