学习了一段时间的JAVA,在这里对最近几次课程所学的 ‘ 栈 ’ 进行总结。
关于栈
栈(Stack)是一种只能在一端进行插入和删除操作的特殊线性表。
它具有 ‘ 后进先出(LIFO)’ 的特性。
如下图,可以把栈比作一个水桶 ,先放的东西在桶的底部,后放的东西在桶顶部。
而我们查看和取出都只能对桶顶部的东西进行操作,如果我定义一个数组,那我们只能先对数组的最后一个元素进行操作,例如下图的a[6],然后才能往下取。
关于 Stack 类
Stack类继承Vector类
下表是Stack类的几种方法
修饰语和类型 | 方法和说明 |
boolean | empty() 测试堆栈是否为空。 |
E | peek() 查看堆栈顶部的对象,但不从堆栈中移除它。 |
E | pop() 移除堆栈顶部的对象,并作为此函数的值返回该对象。 |
E | push(E item) 把项压入堆栈顶部。 |
int | search(Object o) 返回对象在堆栈中的位置,以 1 为基数。 |
实例
这里我暂且用数组来实现栈
ps:我这里用了java的泛型,关于java的泛型在上篇随笔里我有介绍。
1 import java.util.Arrays; 2 3 public class Stack<E> { 4 5 // 新建一个长度为0的数组 6 private Object[] src = new Object[0]; 7 8 // 将数据压入栈 9 public void push(E s) { 10 // 复制src数组,长度为原数组的长度+1 11 E[] e = (E[]) Arrays.copyOf(src, src.length + 1); 12 // 将传入的数据给新数组的最后一个元素 13 e[e.length - 1] = (E) s; 14 src = e; 15 } 16 17 // 查看栈顶的数据 18 public E peek() { 19 // 判断栈是否为空 20 if (src.length == 0) { 21 return null; 22 } 23 // 返回src数组的最后一个元素 24 return (E) src[src.length - 1]; 25 } 26 27 // 弹出栈顶的数据[移除] 28 public E pop() { 29 if (src.length == 0) { 30 return null; 31 } 32 // 将src数组复制给新数组,方便弹出栈顶的数据 33 E[] sr = (E[]) src; 34 E[] e = (E[]) Arrays.copyOf(src, src.length - 1); 35 src = e; 36 return (E) sr[sr.length - 1]; 37 } 38 39 // 获得栈的长度 40 public int size() { 41 return src.length; 42 } 43 44 // 判断栈是否为空 45 public boolean empty() { 46 return src.length == 0; 47 } 48 49 public static void main(String[] args) { 50 Stack<String> st = new Stack<String>(); 51 52 // 将数据压入栈 53 st.push("AA"); 54 st.push("BB"); 55 st.push("CC"); 56 st.push("DD"); 57 58 // 输出栈顶数据 59 System.out.println("栈顶的数据为:" + st.peek()); 60 61 // 输出栈的长度 62 System.out.println("栈的长度为:" + st.size()); 63 64 // 当栈不为空时,弹出栈顶数据 65 while (!st.empty()) { 66 System.out.println("弹出数据:" + st.pop()); 67 } 68 } 69 }
运行结果:
栈顶的数据为:DD 栈的长度为:4 弹出数据:DD 弹出数据:CC 弹出数据:BB 弹出数据:AA
结果分析
遵循了栈 ‘ 后进先出 ’ 的特性,输入 AA、BB、CC、DD,弹出 DD、CC、BB、AA。
根据这个特性,栈在某些时候是必不可少的。