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数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
随机推荐
- CSS学习笔记四:下拉选择框以及其动画特效
以前学的只是了解了css的一些基本属性,在做项目的时候都是直接使用bootstrap响应式来写项目,这样子很方便,很快捷,但是在自己看来还是有一点缺陷的,毕竟,我很多时候不怎么清楚它里面的具体运作.所 ...
- 【多线程】-ThreadPool线程池
ThreadPool介绍: Thread类是一个静态类,所有不存在实例化构造函数操作,直接可以调用其内所存在的方法. 微软官网给出的解释: 提供一个线程池,该线程池可用于执行任务.发送工作项.处理异步 ...
- springboot项目利用devtools实现热部署,改动代码自动生效
一.前言 spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后 ...
- SSM-SpringMVC-20:SpringMVC中处理器方法之返回值void篇
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 处理器的方法我们之前做过,返回值为String的,返回值为ModelAndView的,我们这个讲的这个返回 ...
- Spring Security 源码分析(四):Spring Social实现微信社交登录
社交登录又称作社会化登录(Social Login),是指网站的用户可以使用腾讯QQ.人人网.开心网.新浪微博.搜狐微博.腾讯微博.淘宝.豆瓣.MSN.Google等社会化媒体账号登录该网站. 前言 ...
- ASP.NET三剑客 HttpApplication HttpModule HttpHandler 解析
我们都知道,ASP.Net运行时环境中处理请求是通过一系列对象来完成的,包含HttpApplication,HttpModule, HttpHandler.之所以将这三个对象称之为ASP.NET三剑客 ...
- WinForm时间选择控件(DateTimePicker)如何选择(显示)时分秒
C# Windows窗体应用中,用到时间选择控件DateTimePicker,发现不能选择时分秒,难道要自己写一个控件?! 答案是否定的,通过属性修改是可以选择时间的,DateTimePicker完全 ...
- 2. 引入springmvc
springboot提供了spring-web-starter-web为web开发提供了支持,并且内嵌了tomcat及spring mvc的依赖,而且通过spring-boot-autoconfigu ...
- 【HTTP原理】TCP/IP三次握手和四次挥手
HTTP连接 HTTP协议即超文本传送协议(Hypertext Transfer Protocol),是web联网的基础,也是手机联网常用的协议之一,http协议是建立在TCP协议之上的一种应用. H ...
- MAC下的mysql忘记密码该怎么办??
不要着急,不要慌,好多人会忙手忙脚,以为自己安装了一个假软件,其实是你打开的方式不对而已! step1: 苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务(点击 ...