11.5 栈

栈是一种特殊的列表,它是属于顺序表体系的。栈的特点就是后进先出,就好像一口井,每次往里面丢一块大石头,假设石头足够大,每层就只能放一块石头,那最后放的石头就在最上面,如果要把石头全部拿出来,最后放的石头最早被拿出来。
函数调用就是使用了栈,递归这一节有讲到函数调用的模拟过程,有助于理解栈。
下面将列出栈比较常见的方法:
返回类型函数
说明
示例
intsize()返回链表的长度int len=stack.size(),这个方法和数组的length是一样的
boolean
peek
取得最顶端的元素,但不从栈里删除String str=stack.peek();//假设stack的类型是String
Objectpop()取得最顶端的元素,同时从栈里删除这个元素String str=stack.pop();//假设stack的类型是String
booleanadd(Object o)
添加o到栈
stack.add(list2)
Object
push(Object o)
添加o到栈,push和pop属于栈的特有方法,push和add方法的效果一样,但返回值不同,add返回true表示添加成功,而push返回的是被添加的元素。stack.push(o);
Objectget(int i) 取得容器里第i个元素,下标从0开始stack.get(0)。返回的型是Object,需要强制类型转换:String str=(String)stack.get(0)这个方法类似于数组的a[i]
voidclear()清空栈,此方法调用完后,链表长度为0list.clear()

但这里绝不建议大家使用get这个方法,因为它属于List常规方法,而是使用pop、peek这一具有栈特色的方法,否则就没有必要使用栈了。

下面的代码是一个简单测试:
public static void main(String[]args){
    Stack<Stringstack=new Stack<String();
    stack.push("9");
    stack.push("55");
    String str=stack.pop();
    System.out.println(str);
}
添加了“9”和“55”,然后调用pop,取出来的元素是后加入的“55”,同时从栈里删除,如果栈是空的,那么pop操作会触发EmptyStackException异常(栈为空异常)。所以通常在调用pop之前测试栈是否为空,这是一段小测试代码,先添加10个随机整数,然后遍历打印:
public static void main(String[]args){
    Stack<Stringstack=new Stack<String();
    for(int i=0;i < 10;i++){
        int ran=(int)(Math.random()*100);
        stack.push(ran+"");
        System.out.print(ran+" ");
    }
    System.out.println("\n开始遍历");
    while( ! stack.empty()){
        String str=stack.pop();
        System.out.println(str);
    }
}
添加的十个数字先打印成一行,然后再遍历,我们可以看到,这是按照后进先出的顺序来遍历的。