• 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。

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

  • 相关阅读:
    linux 服务器---FastDFS分布式文件服务器配置
    JFinal getModel方法(从页面表单中获取Model对象)+数据库存储问题
    实现Callable接口。带返回值的线程
    Spring 自动化装配Bean
    Spring--基于代理类ProxyFactoryBean的AOP实现
    Jfinal中的validator理解/详解
    Jfinal中的文件上传
    HotSpot学习(二):虚拟机的启动过程源码解析
    HotSpot学习(一):编译、启动与调试
    Netty的对象池
  • 原文地址:https://www.cnblogs.com/jwznb/p/9054003.html
Copyright © 2020-2023  润新知