java堆栈_Java堆栈

Java堆栈

介绍

栈是一种后进先出的线性表数据结构,分为栈顶和栈底两端,仅允许在表的一端插入元素,这一端被称为栈顶,另外一端称之为栈底。栈,只有两种操作,分为入栈(压栈)和出栈(退栈);向栈中添加元素的操作叫做入栈,相反从栈中删除元素叫做出栈。

特点

• 只能从栈顶添加元素或者删除元素

• 后进先出的数据结构,Last In First Out(LIFO)

为了大家更好的形象了解我们通过示意图来看一下栈的入栈和出栈操作

1. 入栈操作示意图

fde6cb562908fbd5d91ab03fb6569ee5.png

2. 出栈操作示意图(后进的元素先出)

af66ef4d319dfbcb0a4e4df313eea375.png

栈的基本操作

• 向栈中添加一个元素(入栈)

void push(E e)

• 从栈中删除一个元素(出栈)

E pop()

• 查看栈顶元素

E peek()

• 查看栈中元素个数

int getSize()

• 判断栈是否为空

boolean isEmpty()

实现栈的方式,实际上底层有多种实现方式,比如:动态数组等,这里我们使用Java语言本身为我们提供的集合LinkedList

1. 接口定义:Stack

public interface Stack {

/**

* 向栈中添加元素

*

* @param e

*/

void push(E e);

/**

* 从栈中删除元素

*/

void pop();

/**

* 获取栈顶元素

*

* @return

*/

E peek();

/**

* 获取栈中元素个数

*

* @return

*/

int getSize();

/**

* 判断栈中是否为空

*

* @return

*/

boolean isEmpty();

}

2. LinkedListStack 类实现接口Stack

public class LinkedListStack implements Stack {

/**

* 存放栈元素

*/

LinkedList list;

/**

* 构造栈结构

*/

public LinkedListStack() {

list = new LinkedList<>();

}

@Override

public void push(E e) {

list.addLast(e);

}

@Override

public void pop() {

list.removeLast();

}

@Override

public E peek() {

return list.getLast();

}

@Override

public int getSize() {

return list.size();

}

@Override

public boolean isEmpty() {

return list.isEmpty();

}

@Override

public String toString() {

return "LinkedListStack{" +

"list=" + list +

'}';

}

}

3. 测试类:LinkedListStackTest

@Test

public void testLinkedListStack() {

// 栈

Stack stack = new LinkedListStack<>();

// 准备入栈元素

List prepareElements = Arrays.asList("A", "B", "C", "D", "E");

// 入栈

prepareElements.forEach(x -> {

stack.push(x);

System.out.println("入栈操作:" + stack);

});

// 出栈

stack.pop();

System.out.println("出栈操作:" + stack);

// 获取栈顶元素

String peekElement = stack.peek();

System.out.println("栈顶元素:" + peekElement);

// 获取栈中元素的个数

int stackSize = stack.getSize();

System.out.println("栈中元素个数:" + stackSize);

}

4. 运行结果

入栈操作:LinkedListStack{list=[A]}

入栈操作:LinkedListStack{list=[A, B]}

入栈操作:LinkedListStack{list=[A, B, C]}

入栈操作:LinkedListStack{list=[A, B, C, D]}

入栈操作:LinkedListStack{list=[A, B, C, D, E]}

出栈操作:LinkedListStack{list=[A, B, C, D]}

栈顶元素:D

栈中元素个数:4

栈的应用

虚拟机栈的入栈和出栈操作

在Java虚拟机运行时数据区有一块被称之为:虚拟机栈,它是线程私有的,声明周期与线程相同。

我们编写的每个Java方法,每个方法都会在执行的时候同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应这一个栈帧在虚拟机栈中入栈到出栈的过程。

现在我们假设有A、B、C三个方法,在A方法中调用B方法(A->B),在B方法中调用C方法(B->C),C方法执行本方法业务逻辑。

1591848576@f2c47c06e0bf45f875b254fb95f3f4d1.png

当程序执行到A()方法的中的第二行时,此时程序会中断A()方法并开始调用B()方法,然后会在虚拟机栈中记录调用B()方法的栈帧,我这里暂且称之为A2(实际存储的并不是O(∩_∩)O哈!)示意图如下:

3a1a8883fe1b6d3e7fbc1d05c11e8901.png

同理,当程序执行到B()方法中第二行时,此时程序也会中断B()方法开始调用C()方法,然后同样地会在虚拟机栈中生成调用C()方法的栈帧并记录,我这里暂且称之为B2,示意图如下:

aa1803749453f6d1acd44022bf27cb64.png

当程序开始执行到C()方法时,直到执行完C()方法时,这时候,程序该如何执行呢?

802b1a51f63b2f976c773a7c75a51233.png

此时就要查看一下虚拟机栈了,发现虚拟机栈,栈中栈顶的元素是B2,我们的程序就知道了,它是执行到B()方法的B2位置就中断了,去执行C()方法了;现在C()方法执行完成之后,它就可以跳回到B2的位置继续执行了,当B()方法执行完之后,虚拟机栈中的B2栈帧也就可以出栈了,依次类推....

61b48a89909c00edf2f61a027c668a3f.png

如果一个方法,使用递归调用,若递归临界点判断有误,则方法就会一直的被进行入栈操作,如果超过虚拟机栈的默认容量大小,则会出现我们常见的StackOverflowError 异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值