数据结构笔记--栈的总结及java数组实现简单栈结构

杂谈"栈"结构:  

  栈(Stack)是一种插入删除操作都只能在一个位置上进表,这个位置位于表的末端,叫做栈顶(Top).

  对栈的基本操作有push和pop,表示进栈和出栈.也就相当于插入和删除操作.

  栈结构又叫做LIFO(后进先出)表.归根结底是一个表结构,因此任何能够实现表结构的方法都能实现栈.

  在java语言中,ArrayList和LinkedList都支持栈操作,栈操作都是常数时间的操作,栈的实现方式一般有两种,一种是使用顺序存储的方式,即使用数组来实现,用ArrayList可以轻易实现栈结构,也可以自己使用数组来实现,一会下面我就用数组来实现栈,第二种是使用链式存储实现,即可以使用LinkedList来实现.

使用数组实现顺序栈:

  使用arrayList和linkedList实现栈比较简单,毕竟本身他们就是封装好的功能,接下来我用数组来实现一个栈结构:

MyStack:

package com.wang.list;import java.util.Arrays;public class MyStack<T> {//使用数组实现这个栈结构private T[] dataArr;//当前元素的个数private int theSize;//栈的容量private static final int DEFAULT_CAPACITY=10;public MyStack(){clear();}//初始化数组,默认大小10,元素个数theSize初始化为oprivate void clear(){theSize=0;ensureCapacity(DEFAULT_CAPACITY);}//栈元素容量public int size(){return theSize;}private void ensureCapacity(int newCapacity){if(newCapacity<theSize){return;}T[] oldArr=dataArr;dataArr=(T[])new Object[newCapacity];for(int i=0;i<size();i++){dataArr[i]=oldArr[i];}}//入栈public void push(T value){if(dataArr.length==size()){ensureCapacity(size()*2);}dataArr[theSize++]=value;}//栈是否为空public boolean isEmpty(){return size()==0;}//出栈public T pop(){if(isEmpty()){return null;}T theValue=dataArr[theSize-1];dataArr[--theSize]=null;return theValue;}//返回栈尾元素public T peek(){if(isEmpty()){return null;}T theValue=dataArr[theSize-1];return theValue;} 
}

使用Node()辅助类实现链式栈:

 

package com.wang.list;public class MyStack1<T> {private class Node{T data;Node next;public Node(T data,Node next){this.data=data;this.next=next;}}//保存元素个数private int theSize;//保存栈顶元素private Node top;public MyStack1(){top=null;}public MyStack1(T value){top=new Node(value,null);}public void push(T value){top=new Node(value,top);theSize++;}public T pop(){Node old=top;top=top.next;old.next=null;theSize--;return old.data;}public T peek(){return top.data;}public int size(){return theSize;}public boolean isEmpty(){return size()==0;}
}

 

 

 

栈的应用:

  进制转换:

    比如将十进制下的某个数转换为二进制中的某个数,则可以对该数进行除2取余操作,然后将余数压栈,之后再将所有的数出栈,即是所对应的二进制数,这其实是栈对于逆序操作的一个实例.

  平衡符号:

    检查那些成对出现的符号是否匹配,比如(),[],{}等

    实现过程大概如下:

      做一个空栈,读入字符直到文件末尾.如果字符是一个开放符号(比如"{}"中的"{"),则将其推入栈中.如果字符是一个封闭符号(比如"{}"中的"}"),则判断栈是否为空,为空则报错.不为空,则将栈顶元素弹出,判断弹出元素是否是其对应的开放符号,不是则报错,在文件结尾,如果栈非空,就报错.

  后缀表达式:

    不知道何为后缀表达式,请自行百度,后缀表达式的记法又称为逆波兰式,它的求值过程恰好就是从左到右的过程,可以使用一个栈,当见到一个数时就入栈,当遇到一个一个运算符时,就从栈中弹出两个数进行计算,再将所得结果入栈.最后的到的数就是计算结果.

  用于方法调用:

    存在方法调用时,比如在一个方法中调用了另一个方法,这时候需要把当前方法一些重要信息记录并保存下来,保存到一个栈中,然后再跳到新方法中去执行,当方法返回的时候,去查看栈顶的那个保存信息(栈帧),然后进行复原,事实上这是在计算机系统中一个非常重要的应用,上面的全部工作都可以用一个栈来实现.事实上,在实现递归的每一种程序语言都是这么干的,所存储的信息叫做活动记录,或者说栈帧.这个细说,比较复杂,想深入了解,自己百度吧.

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

45岁,一个平凡大叔的异地打工生活

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#xff0c;首发于 【掘金】&#x1f4e2;作者格言&#xff1a;生活在于…

C之结构体

 C语言中数组允许定义类型的变量,可容纳相同类型的多个数据项,但结构体在C语言编程中,它允许定义不同种类的数据项可供其他用户定义的数据类型。 结构是用来代表一个记录,假设要跟踪图书馆的书籍。可能要跟踪有关每本书以下属性: Title - 标题 Author - 作者 Subject…

用高等数学“铲雪”!这个200多年前的证明太厉害了,有城市用它省了2000多万..........

全世界只有3.14 % 的人关注了爆炸吧知识用高等数学清扫脚下路前几天&#xff0c;北京下了2021年的第一场雪。这让生活在广州的超模君羡慕不已&#xff0c;原本打算春节前去哈尔滨看个冰雕&#xff0c;结果由于各种原因一直都没成行。一个月前被关进小黑屋的设计师妹子刚好来自哈…

matlab排版形式是什么样子,工作型PPT,图文排版的4种常见样式

原标题&#xff1a;工作型PPT&#xff0c;图文排版的4种常见样式图片是PPT中最好用的一种元素&#xff0c;正所谓“一图抵过千言”。但要想让图片真正地发挥价值&#xff0c;图文排版的好坏非常关键。本期将聊聊4种图文排版的处理方法。这些方法也是我们日常工作中的PPT图文排版…

申请格式

格式与范文分析&#xff1a;  &#xff08;1&#xff09;标题  有两种写法&#xff0c;一是直接写“申请书”&#xff0c;另一是在“申请书”前加上内容&#xff0c;如“入党申请书”、“调换工作申请书”等&#xff0c;一般采用第二种。 申请书 &#xff08;2&#xff09;…

基于事件驱动架构构建微服务第15部分:SPA前端

原文链接 https://logcorner.com/building-micro-services-through-event-driven-architecture-part15-spa-front-end/在本教程中&#xff0c;我将展示如何使用angular构建SPA前端来发送命令和请求查询。SPA前端使用commandAPI发送命令&#xff08;创建、更新或删除语音&#x…

BBC又一神作,豆瓣9.8分,美轮美奂的大自然不仅仅属于人类

总有那么一些人&#xff0c;满怀着对世界的好奇&#xff0c;不远万里不畏艰难去穿越世界上每一个角落&#xff0c;为我们呈现出仅凭我们自己绝无可能看到的世间真实与美好。今天给大家推荐一部BBC出品的一部纪录片&#xff0c;纪录片爱好者肯定听过&#xff1a;BBC出品&#xf…

thinkphp 3.2 unionall

$where[enterprise_id] $enterpriseId; //企业名称不为空 if(!empty($enterpriseName)){$where[enterprise_name] array(like,"%$enterpriseName%");} $table2 array(enterprise_data.yunkh_enterprise_rel_enterprise>ed_ere,enterprise_data.yunkh_enterpris…

php用switch编写车费的输出,PHP Switch语句在实际代码中的应用

PHP Switch语句在实际代码中的应用PHP语言是一个功能强大的嵌入式HTML语言&#xff0c;下面我们将会为大家介绍其中的PHP Switch语句。如果您希望有选择地执行若干代码块之一&#xff0c;请使用PHP Switch语句。PHP脚本编写在网站开发中的作用解析PHP分页类的具体使用方法PHP跳…

C++相关的复习

h头文件,主要是函数、结构声明,常量定义等 .c,源文件,函数定义 .exe,可执行文件 .dll,动态链接库 .lib,静态链接库 .dsp,.dsw都是工程文件, 。cpp是C++的源文件 源文件一般为 .c .h文件 动态库文件 .so 静态库文件 .a 第 1 章 面向对象分析 1.1 结构化…

如何定义一个 Listint,string 这样的 List ?

咨询区 Benny Ae我在想为什么 C# 中没有内置带两列的 List 结构&#xff0c;如&#xff1a;List<int,string> mylist new List<int,string>();回答区 newfurniturey虽然没有内置&#xff0c;但还是有其他解决方案的&#xff0c;大体上有四种。使用 Tuple<int, s…

局部内部类

内部类不仅可以在类中进行定义&#xff0c;也可以在类的局部位置定义&#xff0c;如在类的方法或任意的作用域中均可以定义内部类。 interface Outinterface2 { } class OuterClass3{ public Outinterface2 doit(final String x) { //doit()方法参数为final类型 //在doit方…

想追身边的女孩?哥们我只能帮到你这份上了

1 接下来&#xff0c;就靠你自己了……2 不是女神就别想了3 你再来&#xff0c;我可撕票喽4 总有刁民想害朕。。5 每次我想偷偷溜出去玩&#xff0c;我妈就6 看看谁在偷懒你点的每个赞&#xff0c;我都认真当成了喜欢

C++中引用概念

前段时间在学习C&#xff0c;学习到了引用的概念&#xff0c;当时也查了好多的资料&#xff0c;网上也有很多关于引用的帖子&#xff0c;多是引用和指针的关系&#xff0c;谭浩强C中对引用的介绍也不是很多&#xff0c;今天把它们整理出来&#xff0c;相信也会对大家有所帮助&a…

php 版本排序,四种常见排序算法--PHP版本

1、冒泡排序法/*** 冒泡排序* des 对一组数据&#xff0c;比较相邻数据的大小&#xff0c;将值小数据在前面&#xff0c;值大的数据放在后面。*/$array [2,5,1,3,7,4];$result bubble_sort($array);print_r($result);function bubble_sort($array){$len count($array);for (…

C#内建接口:IEnumerable

这节讲一下接口IEnumerable。01什么是Enumerable在一些返回集合数据的接口中&#xff0c;我们经常能看到IEnumerable接口的身影。那什么是Enumerable呢&#xff1f;首先它跟C#中的enum关键字所表达的意思是不同的&#xff0c; 从翻译上来看&#xff1a;可枚举的&#xff0c;展开…

ubuntu,kali linux和windows三系统流水账——写给自己

我先说一下ubuntu和windows双系统安装的几种方法&#xff0c;最后总结kali linux的安装&#xff0c;想起什么写什么&#xff0c;所以有点乱。然后记录一下自己的使用过程中遇见的问题和解决的方法&#xff0c;还有我的个人建议。 我个人安装的是目前最新的ubuntu16.04LTS。wind…

一个富二代仅凭“1+1”就压制了全世界的数学家两个世纪......

全世界只有3.14 % 的人关注了爆炸吧知识在数学界&#xff0c;“11”是一个超级大难题&#xff0c;吸引了许多优秀的数学家去攻关打boss。但至今还未有人闯关成功。这位被众多数学家恨得牙痒痒的罪魁祸首就是——克里斯蒂安哥德巴赫。克里斯蒂安哥德巴赫1690年3月18日&#xff0…

用C语言实现数组反序

题目: 比如输入:数组是1,2,3,4,5 反序后的结果是:5,4,3,2,1 实现代码如下 #include <stdio.h> //用数组反序数组 void reserve1(int a[],int n){int m=(n+1)/2;int i=0;for(i;i<m;i++){int j=n-1-i;int temp=a[i];a[i]=a[j];a[j]=temp;} } //用指针进行反…