Java中的栈

学习了一段时间的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。

根据这个特性,栈在某些时候是必不可少的。

 

posted @ 2018-05-18 10:57  jw1102  阅读(228)  评论(0编辑  收藏  举报