当前位置: 首页 > 后端技术 > Java

数据结构之栈:初学者一篇文章

时间:2023-04-01 13:47:42 Java

分类:什么是栈?栈的特点是什么?堆栈是如何实现的?(静态栈、动态栈)栈的具体应用是什么?正文:什么是栈?栈(stack),也称栈,是一个有限操作的线性表。将插入和删除操作限制在列表末尾的线性列表。这一端称为栈顶,另一端称为栈底。向栈中插入一个新元素也称为压入、压入或压入。就是将新元素放到栈顶元素的最上面,使其成为新的栈顶元素;从堆栈中删除元素也称为入栈或出栈。unstack,就是删除栈顶元素,让相邻的元素成为新的栈顶元素。栈的特点是什么?1.栈是一种特殊的线性表,允许同端插入和删除。2、遵循先进后出(last-in-first-out)的原则。指针栈如何实现?栈也分为静态栈和动态栈:静态栈一般用固定大小的数组来表示。动态栈一般用链表表示,其大小是自动扩展的。接下来对两种栈类型进行代码操作:创建栈接口类:/***栈接口类*@authorgxw*@date2021/11/722:14pm*/publicinterfaceStack{//入栈方法voidpush(Objectg);//出栈方法Objectpop();//获取栈顶数据,但不移除Objectpeek();//获取栈的总数intgetSize();//返回栈是否为空booleanisEmpty();//显示栈voiddisplay();}动态栈实现类:/***动态栈:大小可以自动扩展*动态栈依赖链表,所以需要用到Node节点类*@authorgxw*@date2021/11/722:32晚上*/publicclassDynamicStackimplementsStack{//动态栈声明privateNodetopStack=newNode();//栈总的privateint大小;@Overridepublicvoidpush(Objectg){if(size==0)topStack.setData(g);else{//声明新的栈顶节点newTop=newNode();//设置新的栈顶值newTop.setData(g);//设置新栈顶的下一个节点newTop.setNext(topStack);//然后新的栈顶正式去栈顶topStack=newTop;}大小++;}@OverridepublicObjectpop(){//获取栈顶数据ObjecttopData=topStack.getData();//然后出栈,弹出旧的栈顶,下一个节点会自动成为新的栈顶NodenewTopStack=topStack.getNext();topStack=newTopStack;尺寸-;返回顶部数据;}@OverridepublicintgetSize(){返回大小;}@OverridepublicObjectpeek(){if(size==0)returnnull;返回topStack.getData();}@OverridepublicbooleanisEmpty(){返回大小==0;}@Overridepublicvoiddisplay(){NodetopStack2=topStack;System.out.println("显示堆栈");for(inti=0;i=0;i--){System.out.print(staticStack[i]);System.out.print("");}System.out.println("");}}测试:publicstaticvoidmain(String[]args){/***动态堆栈*///初始化构建动态栈System.out.println("********初始化动态栈:********");DynamicStackdynamicStack=newDynamicStack();//推送系统。out.println("推送你好世界!:");dynamicStack.push("你好");dynamicStack.push("世界!");dynamicStack.display();//获取总栈数System.out.println("获取总栈数:");System.out.println(dynamicStack.getSize());//出栈System.out.println("出栈一次");System.out.println("出栈值:"+dynamicStack.pop());dynamicStack.display();//获取总栈数System.out.println("获取总栈数:");System.out.println(dynamicStack.getSize());/***静态栈*///初始化静态栈System.out.println("********初始化静态栈:********");StaticStackstaticStack=newStaticStack(10);//推送你好世界!System.out.println("推送你好世界!:");staticStack.push("你好");staticStack.push("世界!");staticStack.display();//获取栈总数System.out.println("获取静态栈总数:");System.out.println(staticStack.getSize());//弹出栈一次System.out.println("弹出一次:");System.out.println("弹出值:"+staticStack.pop());staticStack.display();//获取总栈数System.out.println("GetstaticTotalnumberofstacks:");System.out.println(staticStack.getSize());}结果:如何申请栈?例如:面试官:请判断括号({[]}),({[]]}),(({[]})三组是否合规,时间复杂度为O(logn)!分析:看到这道题,相信你脑子里一定有很多实验结果,但是你会发现除了栈,其他的都很复杂,只有栈的原理让这道题变得很简单当我们遇到(,{,[,我们都入栈,只要遇到像.},]这样的右括号,我们就出栈,进行匹配判断!接下来我们看代码:/***判断括号组是否合规例如:不合规:({[}),合规:({[]})*@paramstr*@return*/publicstaticbooleanisCorrectForBracketStr(Stringstr){//声明栈,这里使用静态栈StaticStackstaticStack=newStaticStack(str.length());//将括号组字符串转换为字符数组char[]chars=str.toCharArray();对于(inti=0;i