11.5 栈
栈是一种特殊的列表,它是属于顺序表体系的。栈的特点就是后进先出,就好像一口井,每次往里面丢一块大石头,假设石头足够大,每层就只能放一块石头,那最后放的石头就在最上面,如果要把石头全部拿出来,最后放的石头最早被拿出来。
函数调用就是使用了栈,递归这一节有讲到函数调用的模拟过程,有助于理解栈。
下面将列出栈比较常见的方法:
返回类型 | 函数 | 说明 | 示例 |
---|---|---|---|
int | size() | 返回链表的长度 | int len=stack.size(),这个方法和数组的length是一样的 |
boolean | peek | 取得最顶端的元素,但不从栈里删除 | String str=stack.peek();//假设stack的类型是String |
Object | pop() | 取得最顶端的元素,同时从栈里删除这个元素 | String str=stack.pop();//假设stack的类型是String |
boolean | add(Object o) | 添加o到栈 | stack.add(list2) |
Object | push(Object o) | 添加o到栈,push和pop属于栈的特有方法,push和add方法的效果一样,但返回值不同,add返回true表示添加成功,而push返回的是被添加的元素。 | stack.push(o); |
Object | get(int i) | 取得容器里第i个元素,下标从0开始 | stack.get(0)。返回的类型是Object,需要强制类型转换:String str=(String)stack.get(0)这个方法类似于数组的a[i] |
void | clear() | 清空栈,此方法调用完后,链表长度为0 | list.clear() |
但这里绝不建议大家使用get这个方法,因为它属于List常规方法,而是使用pop、peek这一具有栈特色的方法,否则就没有必要使用栈了。
下面的代码是一个简单测试:
public static void main(String[]args){ Stack<String> stack=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<String> stack=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); }}
添加的十个数字先打印成一行,然后再遍历,我们可以看到,这是按照后进先出的顺序来遍历的。