栈是一种常用的数据结构,栈只允许访问栈顶的元素,栈就像一个杯子,每次都只能取杯子顶上的东西,而对于栈就只能每次访问它的栈顶元素,
从而可以达到保护栈顶元素以下的其他元素.”先进后出”或”后进先出”就是栈的一大特点,
先进栈的元素总是要等到后进栈的元素出栈以后才能出栈.递归就是利用到了系统栈,暂时保存临时结果,对临时结果进行保护.

栈是存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)。

栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定。局部变量的数据存在于栈内存中。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量数据(int, short, long, byte, float, double, boolean, char)和对象句柄(引用)。

堆栈是一种 “后进先出”  (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是栈中的一项,该方法返回距离 栈顶最近的出现位置到栈顶的距离; 栈中最上端项的距离


//栈,Vector的子类
public class StackDemo {
// 把元素放入栈顶
static void showpush(Stack st, int a) {
st.push(new Integer(a));
System.out.println("push(" + a + ")");
System.out.println("stack: " + st);
} // 从栈顶删除元素
static void showpop(Stack st) {
System.out.print("pop -> ");
// 判断栈是否为空
if (st.empty()) {
System.out.println("Stack is empty.");
} else {
Integer a = (Integer) st.pop();
System.out.println(a);
System.out.println("stack: " + st);
}
} // 查看栈顶元素
static void showpeek(Stack st) {
System.out.print("peek -> ");
if (st.empty()) {
System.out.println("Stack is empty.");
} else {
Integer a = (Integer) st.peek();
System.out.println(a);
System.out.println("stack: " + st);
}
} // 查询指定元素
static void showsearch(Stack st, int i) {
System.out.print("search -> " + i);
Integer index = (Integer) st.search(i);
System.out.println("--index -> " + index);
System.out.println("stack: " + st);
} public static void main(String args[]) {
Stack st = new Stack();
System.out.println("stack: " + st);
showpush(st, 42);
showpush(st, 66);
showpeek(st);
showsearch(st, 66);
showsearch(st, 88);
showpop(st);
showpop(st);
showpop(st);
}
}

运行结果:

stack: []
push(42)
stack: [42]
push(66)
stack: [42, 66]
peek -> 66
stack: [42, 66]
search -> 66--index -> 1
stack: [42, 66]
search -> 88--index -> -1
stack: [42, 66]
pop -> 66
stack: [42]
pop -> 42
stack: []
pop -> Stack is empty.

 

【Java集合的详细研究9】Java堆栈(stack)的使用方法的更多相关文章

  1. 【Java集合的详细研究8】List,Set,Map用法以及区别

    Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素.一些Collection允许相同的元素而另一些不行.一些能排序而另一些不行.Java ...

  2. 【Java集合的详细研究1】Collections类常用方法总结

    1.sort(Collection)方法的使用(含义:对集合进行排序). 例:对已知集合c进行排序? public class Practice { public static void main(S ...

  3. 【Java集合的详细研究6】Java 数组

    Java 语言中提供的数组是用来存储固定大小的同类型元素. 声明数组变量 double[] myList; // 首选的方法 或 double myList[]; // 效果相同,但不是首选方法 创建 ...

  4. 【Java集合的详细研究5】Java中Array与ArrayList的主要区别

    1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array([]):最高效:但是其容量固定且无法动态改变:     ArrayList:  容量可动态增长:但牺 ...

  5. 【Java集合的详细研究2】浅谈Arrays.asList的使用

    首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean) (2)该方法将数组与列表 ...

  6. 【Java集合的详细研究7】Set和List 的关系与区别

    两个接口都是继承自Collection. List (inteface) 次序是List 的最重要特点,它确保维护元素特定的顺序. --ArrayList 允许对元素快速随机访问. --LinkedL ...

  7. 【Java集合的详细研究4】Java中如何遍历Map对象的4种方法

    方法一 通过Map.entrySet遍历key和value,在for-each循环中使用entries来遍历.推荐,尤其是容量大时 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使 ...

  8. 【Java集合的详细研究3】Arrays类常用方法

    1.void sort(array)对数组array的元素进行升序排序 2.int binarySearch(array,val):查询元素值val在数组array中的下标 3.String toSt ...

  9. Java集合详解8:Java的集合类细节精讲

    Java集合详解8:Java集合类细节精讲 今天我们来探索一下Java集合类中的一些技术细节.主要是对一些比较容易被遗漏和误解的知识点做一些讲解和补充.可能不全面,还请谅解. 本文参考:http:// ...

随机推荐

  1. php的安装

    首先我们安装nginx #0.安装ningx(可选cd /disk1/toolsrpm -ivh  http://nginx.org/packages/centos/6/noarch/RPMS/ngi ...

  2. SpringDaoSupport

    @Component public class SuperDAO extends HibernateDaoSupport { @Resource(name="sessionFactory&q ...

  3. Ambari-stack介绍

    Ambari-stack总体介绍 Ambari-stack 表示hadoop某个发行版本号.比如HDP-1.0.0,在用ambari创建一个集群时,首先要通过调用restfulAPI设置stack版本 ...

  4. Class.getResourceAsStream和ClassLoader.getResourceAsStream方法

    项目中,有时候要读取当前classpath下的一些配置文件,下面介绍下Class.getResourceAsStream和ClassLoader.getResourceAsStream两种方法以及两者 ...

  5. ssh-copy-id 安全地复制公钥到远程服务器上

    [root@NB .ssh]# ssh-copy-id -i id_rsa.pub " -p22 root@150.57.38.226" root@150.57.38.226's ...

  6. CCCatmullRomBy和CCPointArray

    CCCatmullRomBy:把某一对象以Catmull-Rom curve曲线移动一段距离 CCPointArray *array = CCPointArray::create(); array-& ...

  7. vue2的全局变量的设置

    最近在学习VUE.js 中间涉及到JS全局变量,与其说是VUE的全局变量,不如说是模块化JS开发的全局变量. 1.全局变量专用模块 就是以一个特定模块来组织管理这些全局量,需要引用的地方导入该模块便好 ...

  8. nrm 的使用说明

    nrm -- NPM registry 管理工具 开发的npm registry 管理工具 nrm, 能够查看和切换当前使用的registry, 最近NPM经常 down 掉, 这个还是很有用的哈哈 ...

  9. LocationActivity

    package com.baidu.location.demo; import com.baidu.baidulocationdemo.R;import com.baidu.location.BDLo ...

  10. linux 基本配置tab键和显示行号 和中文输入法

    一.仅设置当前用户的Tab键宽度 输入命令:vim ~/.vimrc 然后:set tabstop=4   //我这里将Tab键的宽度设置为4 保存:ctrl+z+z(或:wq!) OK! 二.设置所 ...