java中堆栈的基本代码 java中堆栈分别存放什么数据

JAVA编程实现堆栈出栈操作!数组实现的堆栈:ArrayStack.java
public class ArrayStack {
Object[] m_elements;
int m_size;
public ArrayStack(int len) {
m_elements = new Object[len];
m_size = 0;
}
public ArrayStack() {
this(50);
}
// insert onto stack
public void push(Object element) {
m_elements[m_size] = element;
m_size;
}
// return and remove the top element
public Object pop() {
if (!this.isEmpty()) {
Object obj = m_elements[m_size - 1];
m_elements[m_size - 1] = null;
m_size--;
return obj;
} else {
return null;
【java中堆栈的基本代码 java中堆栈分别存放什么数据】}
}
// return the top element
public Object top() {
if (!this.isEmpty()) {
return m_elements[m_size - 1];
} else {
return null;
}
}
// return 1 -- is empty
// return 0 -- is not empty
public boolean isEmpty() {
return this.size() == 0;
}
public int size() {
return m_size;
}
}
使用链表实现(单链表) :
public class Stacklist {
Node m_header;
int m_size;
public ListStack() {
m_header = null;
m_size = 0;
}
public void push(Object value) {
m_header = new Node(value, m_header);
}
public Object pop() {
if (!this.isEmpty()) {
throw new RuntimeException("Stack underflow");
}
Object obj = m_header.element;
m_header = m_header.next;
return obj;
}
// return reference to most recently added elemenet
public Object peek() {
if (!this.isEmpty()) {
throw new RuntimeException("Stack underflow");
}
return m_header.element;
}
public boolean isEmpty() {
return this.size() == 0;
}
//return the number of the queue's elements;
public int size() {
return m_size;
}
}
链表的需要用到一个结点类 Node.java 代码如下
public class Node {
Object element;
Node next;
public Node(Object theElement) {
this(theElement, null);
}
public Node(Object theElement, Node n) {
element = theElement;
next = n;
}
public Object getElement() {
return element;
}
public void setElement(Object element) {
this.element = element;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
}
Java 堆栈Stack使用java中stack的使用方法,堆栈是一种"后进先出"(LIFO) 的数据结构 , 只能在一端进行插入(称为"压栈") 或删除 (称为"出栈")数据的操作,下面看示例:
JAVA 中,使用 java.util.Stack 类的构造方法创建对象 。
public class Stack extends vector
构造方法 : public Stack() 创建一个空 Stack 。
方法:
1. public push(item )把项 压入栈顶 。其作用与 addElement (item ) 相同 。
参数 item 压入栈顶的项。返回: item 参数 ;
2. public pop () 移除栈顶对象,并作为函数的值 返回该对象 。
返回:栈顶对象(Vector 对象的中的最后一项) 。
抛出异常 : EmptyStackException 如果堆栈式空的。。。
3. public peek() 查看栈顶对象而不移除它 。。
返回:栈顶对象(Vector 对象的中的最后一项) 。
抛出异常 : EmptyStackException 如果堆栈式空的。。。
4. public boolean empty (测试堆栈是否为空 。)当且仅当堆栈中不含任何项时 返回 true,否则 返回 false.
5. public int search(object o)返回对象在堆栈中位置,以 1 为基数,如果对象 o是栈中的一项,该方法返回距离 栈顶最近的出现位置到栈顶的距离; 栈中最上端项的距离为 1。
java堆栈是啥Java中堆栈java中堆栈的基本代码的概念是逻辑上的java中堆栈的基本代码,在完全符合Java规范的Java处理器面世之前,所有Java虚拟机提供的内容都是由软件模拟出来的 。什么叫堆?你用十几个麻将牌竖直叠成一摞这叫堆,你可以从上面、下面、中间任意抽出一张牌,也可以任意插入一张 。什么叫栈?AK-47的弹匣就是一个栈,在上面的子弹没被取出之前,你无法取出下面的子弹——尽管你可以从边上的透明部分读出里面装的是什么型号、颜色的子弹 。堆很灵活,但是不安全 。对于对象 , java中堆栈的基本代码我们要动态地创建、销毁 , 不能说后创建的对象没有销毁 , 先前创建的对象就不能销毁,那样的话我们的程序就寸步难行,所以Java中用堆来存储对象 。而一旦堆中的对象被销毁 , 我们继续引用这个对象的话 , 就会出现著名的NullPointerException,这就是堆的缺点——错误的引用逻辑只有在运行时才会被发现 。栈不灵活,但是很严格,是安全的 , 易于管理 。因为只要上面的引用没有销毁,下面引用就一定还在,所以 , 在栈中,上面引用永远可以通过下面引用来查找对象,同时如果确认某一区间的内容会一起存在、一起销毁 , 也可以上下互相引用 。在大部分程序中,都是先定义的变量、引用先进栈,后定义的后进栈 , 同时,区块内部的变量、引用在进入区块时压栈,区块结束时出栈,理解了这种机制,我们就可以很方便地理解各种编程语言的作用域的概念了,同时这也是栈的优点——错误的引用逻辑在编译时就可以被发现 。在Java中 , 引用可以理解为一个永远指向对象的指针,Java没有指向指针的指针 。关于堆栈的资料几乎每个讲数据结构的书上都有,而至于Java中堆、栈的具体机制你可以参考一些关于Java虚拟机原理的书,不过这个好像比较难理解,我是没指望理解的了 。以上都是我的个人观点,仅供参考 。
JAVA堆栈问题其实这些基础的东西网上有不少,
你可以多去csdn,那里可以学到不少好东西
,我就直接给你粘贴过来了
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中所有对象的存储空间都是在堆中分配的 , 但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已 。
用java代码编写堆栈?参看:1import java.util.*; 2 3public class TestStack { 4public static void main(String[] args) { 5Stack stack = new Stack(); 6 7for(int i = 0; i10; i) { 8stack.push(new Integer(i)); 9}1011if(!stack.empty()) {12System.out.println(stack.pop());13}14}15}
关于java中堆栈的基本代码和java中堆栈分别存放什么数据的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读