一个java 打印堆栈堆栈(stack)的问题

Java篇:Stack类-堆栈类的使用
//Stack类使用,栈使用的是后进先出方式工作,Stack类的定义如下:
public class Stack&E& extends
Vector&E&&
--&是Vector的子类
栈的工作原理如下:
事例代码:
import java.util.S
public class StackDemo{
public static void main(String args[]){
&&&&&&&&&&&&&&&&&&
Stack&String& stack = new
Stack&String&() ;
&&&&&&&&&&&&&&&&&&
System.out.println("入栈顺序:A、B、C、D") ;
&&&&&&&&&&&&&&&&&&
stack.push("A")
//入栈,把元素压入栈顶
&&&&&&&&&&&&&&&&&&
stack.push("B")
//入栈,把元素压入栈顶
&&&&&&&&&&&&&&&&&&
stack.push("C")
//入栈,把元素压入栈顶
&&&&&&&&&&&&&&&&&&
stack.push("D")
//入栈,把元素压入栈顶
&&&&&&&&&&&&&&&&&&
System.out.print("出栈顺序:") ;
&&&&&&&&&&&&&&&&&&
System.out.print(stack.pop() + "、")
;&&& //出栈
&&&&&&&&&&&&&&&&&&
System.out.print(stack.pop() + "、")
;&&& //出栈
&&&&&&&&&&&&&&&&&&
System.out.print(stack.pop() + "、")
;&&& //出栈
&&&&&&&&&&&&&&&&&&
System.out.println(stack.pop())
;&&& //出栈
&&&&&&&&&&&&&&&&&&
//System.out.println(stack.pop() + "、")
;&//出栈,如果没有元素了就会出现异常
栈类的方法:
peek方法也是出栈操作,也是返回栈顶元素,但是它不移除元素,不像pop方法,每使用一次就将栈顶元素移除。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。java中堆栈(stack)和堆(heap) - CSDN博客
java中堆栈(stack)和堆(heap)
以往学习中的一个模糊点:
&java中堆栈(stack)和堆(heap)
一、堆栈(stack)和堆(heap)?
(1)内存分配的策略
  按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.
&&  静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.
&&  栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。
&&  静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.
(2)堆和栈的比较
  上面的定义从编译原理的教材中总结而来,除静态存储分配之外,都显得很呆板和难以理解,下面撇开静态存储分配,集中比较堆和栈:
&&  从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的.而这种不同又主要是由于堆和栈的特点决定的:
&&  在编程中,例如C/C++中,所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候,修改栈指针就可以把栈中的内容销毁.这样的模式速度最快,当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程序运行时进行的,但是分配的大小多少是确定的,不变的,而这个&大小多少&是在编译时确定的,不是在运行时.
 && 堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中,要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!这也正是导致我们刚才所说的效率低的原因,看来列宁同志说的好,人的优点往往也是人的缺点,人的缺点往往也是人的优点(晕~).
(3)JVM中的堆和栈
  JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。
  & 我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译原理中的活动纪录的概念是差不多的.
   从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。
 && 每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。
本文已收录于以下专栏:
相关文章推荐
static使用的指意事项:
1.静态方法只能访问静态成员变量和函数 。
注:非静态既可以访问静态也可以访问非静态
2.静态访问中不能使用this和super
3.主函数是静态的
Java栈与堆
堆:顺序随意
栈:后进先出(Last-in/First-Out).
     Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、an...
前面的几篇都没有太明确地指出 方法区 是什么?现在通过一些资料的收集和学习,下面做一些总结
什么是方法区:
方法区是系统分配的一个内存逻辑区域,是JVM在装载类文件时,用于存储类型信息的(类的描述...
Java栈与堆 ----对这两个概念的不明好久,终于找到一篇好文,拿来共享 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员...
堆栈这个概念存在于数据结构中,也存在于jvm虚拟机中,在这两个环境中是截然不同的意思。
在数据结构中,堆栈是:堆 和栈两种数据结构,堆是完全二叉树,堆中各元素是有序的。在这个二叉树中所有的双亲节点和...
一。------------------------------------------------------------
堆--用new建立,垃圾自动回收负责回收
1、堆是一个&运行时...
1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
  2. 栈的优势是,存取速度比堆要快,仅次于...
1.Java的内存机制
 Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java ...
Java语言的一个显著特点就是跨平台型
浅堆和深堆
浅堆(Shallow Heap)和深堆(Retained Heap)是两个非常重要的概念,它们分别表示一个对象结构所占用的内存大小和一个对象被GC回收后,可以真实释放的内存大小。
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Java(35)
栈的特点:
1.栈(Stack)实现了一个后进先出(LIFO)的数据结构。只能在一端进行插入(称为&压栈&) 或删除 (称为&出栈&)数据的操作。当你从栈中取元素的时候,就从栈顶取一个元素。也就是,最后进栈的元素最先被取出。不是也有先进先出的数据结构局吗?有,但是这个Stack是实现了先进后出!
2.栈是Vector的子类。&public class Stack extends vector
3.栈只定义了默认构造函数:Stack(),用来创建一个空栈。 栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。
boolean empty()&
测试栈是否为空。
Object peek( )
查看栈顶部的对象,但不从堆栈中移除它。
Object pop( )
查看顶部对象,并移除栈顶部的对象,并作为此函数的值返回该对象。
Object push(Object element)
把项压入栈顶部。
int search(Object element)
返回对象在栈中的位置,以 1 为基数。
注:注意上面的peek()方法和pop()方法的区别!
下面的程序说明这个集合所支持的几种方法
import&java.util.S &
public&class&StackTest&{&&
&&&&public&static&void&main(String[]&args)&{&&
&&&&&&&&Stack&String&&stack&=&new&Stack&String&();&&
&&&&&&&&System.out.println(&now&the&stack&is&&&+&isEmpty(stack));&&
&&&&&&&&stack.push(&1&);&&
&&&&&&&&stack.push(&2&);&&
&&&&&&&&stack.push(&3&);&&
&&&&&&&&stack.push(&4&);&&
&&&&&&&&stack.push(&5&);&&
&&&&&&&&System.out.println(&now&the&stack&is&&&+&isEmpty(stack));&&
&&&&&&&&System.out.println(stack.peek());&&
&&&&&&&&System.out.println(stack.pop());&&
&&&&&&&&System.out.println(stack.pop());&&
&&&&&&&&System.out.println(stack.search(&2&));&&
&&&&public&static&String&isEmpty(Stack&String&&stack)&{&&
&&&&&&&&return&stack.empty()&?&&empty&&:&&not&empty&;&&
now&the&stack&is&not&empty&&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:65002次
积分:1338
积分:1338
排名:千里之外
原创:66篇
转载:47篇
(7)(7)(10)(4)(12)(2)(3)(10)(1)(7)(6)(44)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'职友集:让就业决策更聪明博客分类:
(1)、寄存器(Registers):
&&&& 这是速度最快的存储场所,因为寄存器位于处理器内部,这一点和其他的存储媒介都不一样。不过寄存器个数是有限的。在内存中的寄存器区域是由编译器根据需要来分配的。我们程序开发人员不能够通过代码来控制这个寄存器的分配。所以说,这第一个存储区域寄存器,我们只能够看看,而不能够对其产生任何的影响。,也没办法在程序里头感觉到寄存器的任何存在迹象。
(2)、Stack(堆栈):
&&& 位于一般的RAM中。处理器经由指针提供直接支持。当程序配置一块新的内存时,stack指针便往后移;释放内存时,指针则往前移。这种方式不仅很快,效率也高,速度仅次于寄存器。用于存放对象引用以及基本的数据类型对象,不能用于存储Java对象本身。
(3)、Heap(堆):
&&& 一种通用的内存空间,用来存放Java对象。Heap不同于stack之处在于,编译器不需知道究竟得从heap中配置多少空间,也不需知道从heap上配置的空间究竟需要存在多久。因此,自heap配置存储空间可以获得高度的弹性。每当你需要产生对象,只需在程序中使用new,那么执行的时候,便会自heap配置空间。当然,你得为这样的弹性付出代价:从heap配置空间,比从stack配置,所耗费的时间多了不少。
(4)静态存储区域与常量存储区域:
&&& 静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数据,Java在内存中专门划分了一个静态存储区域来管理一些特殊的数据变量如静态的数据变量,需要明确的一点就是,Java对象是不保存在这个地方的,而只是把对象中的一些特殊元素放置这。
&&& 在Java对象中还有一类特殊的元素,我们叫做常量。由于常量的值是稳定不变的,如圆周率。为此把他们放在代码的内部是可行的。不过有些时候,在进行一些嵌入式系统开发的时候,我们往往不这么做。而是会把常量元素跟代码分开来保存。如我们会根据情况把常量的值存放在一些只读存储器中。这主要是为了一些特殊的功能考虑的。如出于版权控制的需要。如在打印机上为了保护原装耗材的版权,往往把常量跟代码分开存放
(5)非RAM存储:
&&& 有时候,有些程序运行所需要的数据我们还会放置在其他地方。如在一些系统中需要用到流对象,这个对象的数据并没有保存在上面所谈到的任何一个存储区域,这个对象直接被转为为字节流,发送到其他的主机上去了。另外有一种叫做持久化的对象,其是被存储在硬盘中的
速度:
&&& 寄存器 & 堆栈 & 堆 & 其他
浏览: 62716 次
来自: 安徽
解释的挺好 给力
官网上不去, 这里下到了, 感谢
通篇错误。我晕掉了。
光有数量每有质量啊!~
居然把大牛都引出来了,哈哈哈!兴奋啊,向您致敬!我会努力下去的 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 java 堆栈分析 的文章

 

随机推荐