【CodeGeek】栈的实践与应用

前言

   最近小编加入了公司的一个组织CodeGeek,和同事们一起研究Java的基础知识,从最基础的地方来了解Java的相关知识。最近这一段时间,将要一起研究《数据结构和算法--java版》这本书中的基本内容,今天我们从底层知识的基本一起来了解一下栈吧。

叙述

是什么

   现实生活中:比如一摞椅子,只能将最顶端的椅了移出,也只能将新椅了放到最顶端。

   计算机中:栈是最基本的数据结构之一,栈是存放对象的一种特殊容器,在插入与删除对象时,这种结构遵循后进先出的原则,也就是说,对象可以任意插入栈中,但每次取出的都是此前插入的最后的一个对象。

栈的操作:

操作方法:

具体应用:

How

java中的应用:

  在Java的java.util包中己经专门为栈结构内建了一个类一一java.util.Stack。任何Java对象都可以作为该内建类的栈元素,同时该类还提供了多种方法:push()、pop()、peek()(功能等价于top())、getSize()以及empty()(功能等价于isEmptY()在遇到空栈时,方法pop()和peek()都会报意外错ExceptionStackEmpty。

代码实现栈:  

public interface stack{

	public  int getSize(); // 返回栈中元素数目 

	public  boolean isEmpty() ;// 判断栈是否为空 

	public  Object top() throws ExceptionstackEmpty;//取栈顶元素(但不删除) 
		
	public  void push (Object ele) ; // 入栈 

	public  Object pop() throws ExceptionStackEmpty; // 出栈


}

栈的应用场景:

1、JVM中

(1)方法栈:

   任一运行中的Java程序(更准确地说,应该是运行中的Java线程)都会配备一个私有的栈,称作Java方法栈(Java method stack)或简称(Java stack),用来记录各个方法在被调用过程中的局部变量等重要信息。
   具体来说,在Java程序的执行期间,JVM会维护一个栈,其中的元素分别是当前活跃的某个方法实例的描述符,称作帧(Frame)。比如,若方法N调用了方法M,则在M的这个实例所对应的帧中,记录了该实例的调用参数以及其中的局部变量,还有关于N的信息,以及在M结束时应该返回给N的东西。

JVM还会通过Java栈将参数传递给被调用的方法。具体来说,Java是按照“值传递”的方式传递参数的。也就是说,以参数形式传递给被调用方法的,总是变量或表达式当前的实际值。

(2)递归

   借助栈来实现方法调用的优点之一,就是支持程序的递归。Java允许方法直接或间接地自我调用。鉴于递归程序的简洁性和高效性,现代程序设计语言几乎都采用了这一模式。
    如果对递归程序的运行进行跟踪,那么每一个方框都分别对应于Java方法栈中的某一帧。而且,在任一时刻,Java方法栈中的所有帧,自底向上依次对应于从方法main到当前活跃方法的一条调用路径。

(3)操作数

2、集合中
3、CPU

4、浏览器、访问地址

    网络浏览器会将用户最近访问过的地址组织为一个栈。用户每访问一个新页面,其地址就会被存放至栈顶,而用户每次按下"Back"按钮,最后一个被记录下的地址就会被清除掉。

5、文本编辑器:

    当今主流的文本编辑器大都支持编辑操作的历史记录功能。用户的编辑操作会被依次记录在一个栈中,一旦出现误操作,用户只需按下"Undo"按钮,即可撤销最近一次操作并回到此前的编辑状态

 

Why

 

好处

(1)强制转换

 

    我们通过定义Stack接口并进而以Java类形式实现这一接口,完成了对栈ADT的实现。通过这一种形式,我们可以看出栈的一个突出优点:它使得我们能够用栈来存放来自于不同类的通用对象,无论是Integer对象、Student对象还是Planet对象,Stack_Array都可以存放。
(2)借助栈进行数组倒置
  根据后进先出的原则,在任意时刻,自栈顶到栈底,栈数组中的元素必然按照入栈次序逆序排列利用这一特性,可以逆向访问数组的成员。算法的思想:将数组的所有元素依次压入栈中,然后不断退栈,并将弹出的元素依次填入数组。

 

(3)传递参数

   栈在程序中作用有传递参数,保存寄存器的值和保存局部变量。 在传递参数的过程中,如果传递参数少于四个,则直接用寄存器传递。若传递参数多于四个,则使用寄存器+内存传递

小结

    原来对于栈只是在理论上了解栈,这一次通过大家的一起探讨,方法对于栈的理解有深了一步,教是最好的学,一定要把现在所学的知识讲出来,学习效果会更好。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hi-Sunshine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值