java数据结构和算法02(栈)
什么叫做栈(Stack)呢?这里的栈和jvm的java栈可不是一个东西。。。
栈作为一种数据结构,我感觉栈就类似一种接口,实现的话有很多种,比如用数组、集合、链表都可以实现栈的功能,栈最大的特点就是先进后出,可以想象一下放羽毛球的盒子怎么放进羽毛球和拿出来羽毛球,我们把放进羽毛球的动作就叫做压栈或者入栈(push),拿出羽毛球的动作就叫做弹栈或出栈(pop)
其实在java中已经有个栈的实现了,就是Stack,我们简单用一下:
package com.wyq.thread; import java.util.Stack; public class MyStack { public static void main(String[] args) { Stack<Object> stack = new Stack<Object>(); stack.push("老王"); stack.push(123); stack.push(false); stack.push('a'); System.out.println(stack.toString()); for (int i = 0; i < 4; i++) { System.out.println(stack.pop()); } } }
这个Stack默认使用集合实现的,这个类是继承了Vector,而Vector这个类就是一个集合,实现了List接口的,而且我们还知道这个Vector这个类是线程安全的,每个方法都加了synchronized关键字,所以也就是说效率不会怎么高。我们可以试试用数组来自己简单实现一个栈,可能就对栈这种数据结构有点了解了,为什么栈是先进后出的呢?假如我们要实现怎么才能实现这种进出方式呢?
在我们实现的栈中我不会实心扩容的,因为逻辑一多就容易弄混,但是我还是将扩容的原理说一下:
假如有一个最大容量是20数组A,还会有个负载因子一般是0.75,这个负载因子干什么用的呢?
这个0.75就是a/b得出来的,虽然可以修改这个0.75这个值,但是据说0.75是最稳定的最好不要修改这个值;
当我们往A数组中放数据,当放了20*0.75=15个数据之后,此时这个数组就会收到一个警报,快装满了,赶紧想想办法,于是啊,又创建出了一个比20更大的数组,假设是40容量的数组B,然后我们就把A数组中的所有数据都复制到B数组中,再把指向数组A的引用修改为指向数组B的引用就ok了,如下图所示:
我们自己实现的栈为了简洁起见,越简洁越好,就不弄这些花里胡哨的东西了,怎么简单怎么来,想进行扩容的小伙伴可以自己添加扩容方法;
顺便说一个简单的东西,++n和n++,--n和n--的区别:比如Value = ++n,这表示n先+1再赋值给value,比如value = n++,这就表示n先赋值给value,然后n再+1
package com.wyq.thread; import java.util.Arrays; public class MyStack { private Object[] arr; //数组中最大的容量 private int maxlength; //指向栈顶的元素,也就是指向数组最后一个位置的元素 private int top; //调用有参构造,默认是10个容量的数组 public MyStack(){ this(10); } public MyStack(int len){ this.maxlength = len; arr = new Object[maxlength]; top = -1;//因为刚开始数组中没有数据,我们把top=-1表示数组中没有元素 } //压栈,首先要保证top的值不能大于最大的索引,不然数据都放到数组外面了 //要想将一个数据丢进栈中,先将top往后往后移动一个位置,然后在这个位置放入数据 public void push(Object obj){ if (top<maxlength-1) { arr[++top] = obj; } } //弹栈,首先找到栈顶的元素,这个peek()方法就在下面,将这个栈顶的元素返回,然后经数组最后一个数据变为null //最后就是将top往前移动一个位置,确保top始终指向的是栈顶元素(数组最后一个元素) public Object pop(){ Object peek = peek(); arr[top--]=null; return peek; } //查询栈顶的数据,注意此时并没有弹栈,我们只是想看看栈顶是什么东西 public Object peek(){ return arr[top]; } //重写toString方法,更好的进行展示栈中的数据 @Override public String toString() { return Arrays.toString(arr)+"]"; } public static void main(String[] args) { MyStack stack = new MyStack(); stack.push("老王"); stack.push(123); stack.push(false); stack.push('a'); System.out.println(stack.toString()); for (int i = 0; i < 4; i++) { System.out.println(stack.pop()); } } }
感觉比上一篇的array容易不少啊.....
java数据结构和算法02(栈)的更多相关文章
- 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现
本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是 ...
- java数据结构与算法之栈(Stack)设计与实现
本篇是java数据结构与算法的第4篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型 栈是一种用于 ...
- Java数据结构和算法(一)--栈
栈: 英文名stack,特点是只允许访问最后插入的那个元素,也就是LIFO(后进先出) jdk中的stack源码: public class Stack<E> extends Vector ...
- Java数据结构和算法(四)——栈
stack,中文翻译为堆栈,事实上指的是栈,heap,堆. 这里讲的是数据结构的栈,不是内存分配里面的堆和栈. 栈是先进后出的数据的结构,好比你碟子一个一个堆起来.最后放的那个是堆在最上面的. 队列就 ...
- Java数据结构和算法之栈与队列
二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为 ...
- Java数据结构与算法(2):栈
栈是一种线性表,特点在于它只能在一个位置上进行插入和删除,该位置是表的末端,叫做栈的顶(top).因此栈是后进先出的(FIFO).栈的基本操作有push.peek.pop. 栈的示意图 进栈和出栈都只 ...
- Java数据结构和算法(五)——队列
队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
随机推荐
- IE条件注释,为IE单独写js
<!--[if IE ]> <body class="ie"> <![endif]--> <!--[if !IE]>--> & ...
- 学习JavaScript最佳实践方法
首先要说明的是,咱现在不是高手,最多还是一个半桶水,算是入了JS的门. 谈不上经验,都是一些教训. 这个时候有人要说,“靠,你丫半桶水,凭啥教我们”.您先别急着骂,先听我说. 你叫一个大学生去教小学数 ...
- Python3 urllib.request库的基本使用
Python3 urllib.request库的基本使用 所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地. 在Python中有很多库可以用来抓取网页,我们先学习urlli ...
- pycharm中from xx import xx报错:Unresolved reference
出现问题:无法引用到相关的类,但是这些类确实都在工程中 分析原因:import不成功是路径没对应上,pycharm默认该项目的根目录为source目录 解决方案: 将对应的项目searchTest,选 ...
- ES6 中的 iterator
[简介] 遍历器/迭代器.任何数据结构只要部署 Iterator 接口,就可以完成遍历操作.这种数据结构是“可遍历的”(iterable). 如何判断是否可遍历? typeof target[Symb ...
- Stack编程队列
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 首先定义两个栈 Stack<Integer> stack1 = new Stack<I ...
- 消息中间件activemq的使用场景介绍(结合springboot的示例)
一.消息队列概述 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构.是大型分布式系统不可缺少的中间件. 目前在生产环境,使 ...
- 【转】tomcat logs 目录下各日志文件的含义
tomcat每次启动时,自动在logs目录下生产以下日志文件,按照日期自动备份 localhost.2016-07-05.txt //经常用到的文件之一 ,程序异常没有被捕获的时候抛出的地方 ...
- java通过反射获取字段的类型
import java.lang.reflect.Field; //这是需要引入的包 Field[] f = 类名.class.getDeclaredFields(); //获取该类的字段for(F ...
- SSM-SpringMVC-33:SpringMVC中拦截器Interceptor讲解
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 拦截器Interceptor: 对处理方法进行双向的拦截,可以对其做日志记录等 我选择的是实现Handler ...