首页 > 编程语言 >stack源码阅读

stack源码阅读

时间:2024-06-02 17:48:28浏览次数:45  
标签:index code elementData public elementCount 源码 阅读 stack

java Stack

  1. stack是一个后进先出的数据结构,继承于vector,自身提供了五种方法,pop、push、empty、peek、search

  2. 本文主要介绍

    • pop 将一个元素入栈

    • push 将一个元素出栈



package java.util;

/**
 * The {@code Stack} class represents a last-in-first-out
 * (LIFO) stack of objects. It extends class {@code Vector} with five
 * operations that allow a vector to be treated as a stack. The usual
 * {@code push} and {@code pop} operations are provided, as well as a
 * method to {@code peek} at the top item on the stack, a method to test
 * for whether the stack is {@code empty}, and a method to {@code search}
 * the stack for an item and discover how far it is from the top.
 // stack是一个后进先出的栈对象,继承了vector,有5个方法
 // 1.push 2.pop 3.peek 4.empty 5.search
 * <p>
 * When a stack is first created, it contains no items.
 *
 * <p>A more complete and consistent set of LIFO stack operations is
 * provided by the {@link Deque} interface and its implementations, which
 * should be used in preference to this class.  For example:
 * <pre>   {@code
 // 这个是说使用deque来实现更好,deque提供了更多的方法
 *   Deque<Integer> stack = new ArrayDeque<Integer>();}</pre>
 *
 * @author  Jonathan Payne
 * @since   1.0
 */
public class Stack<E> extends Vector<E> {
    /**
     * 创建了一个新的stack
     */
    public Stack() {
    }

    /**
 		往栈中加入一个元素
     */
    public E push(E item) {
        addElement(item);

        return item;
    }
    ================================addElement============================================
     public synchronized void addElement(E obj) {
        modCount++;
        add(obj, elementData, elementCount);
    }
    ================================add============================================
   private void add(E e, Object[] elementData, int s) {
    //如果数组已满就使用grow() 方法进行扩容
    if (s == elementData.length)
        elementData = grow();
    //直接赋值
    elementData[s] = e;
    //在让元素个数加一
    elementCount = s + 1;
    }
    
    
    /**
  	移除一个最后的元素并且返回该元素的值。
     */
    public synchronized E pop() {
        E       obj;
        //获得数组的当前长度
        int     len = size();
		//获得数组的最后一个数值
        obj = peek();
        //移除位于数组最后的元素
        removeElementAt(len - 1);

        return obj;
    }
	/******************************************removeElementAt**************************************/
    //移除最后一个元素的逻辑    
    public synchronized void removeElementAt(int index) {
        if (index >= elementCount) {
            throw new ArrayIndexOutOfBoundsException(index + " >= " +
                                                     elementCount);
        }
        else if (index < 0) {
            throw new ArrayIndexOutOfBoundsException(index);
        }
        //计算index位置后需要移动的个数,这个比较好,直接提高了方法的复用性
        int j = elementCount - index - 1;
        if (j > 0) {
            System.arraycopy(elementData, index + 1, elementData, index, j);
        }
        //记录修改次数
        modCount++;
        //元素个数减一
        elementCount--;
        //将该位置设置为null,便于jvm进行垃圾回收
        elementData[elementCount] = null; /* to let gc do its work */
    }
    
    
    
    /**
     * Looks at the object at the top of this stack without removing it
     * from the stack.
     *
     * @return  the object at the top of this stack (the last item
     *          of the {@code Vector} object).
     */
    public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }


  
}

标签:index,code,elementData,public,elementCount,源码,阅读,stack
From: https://www.cnblogs.com/lssl/p/18227368

相关文章

  • C程序设计语言 (Brian W. Kernighan, Dennis M. Ritchie)电子版阅读笔记
    书:pan.baidu.com/s/1-uwg0rd__HXJJvc9Gj7C8w?pwd=xrgo提取码:xrgoC语言概述:介绍C语言的历史、特点以及在软件开发中的应用。数据类型:讲解C语言中的基本数据类型,如整型、浮点型、字符型等。变量与常量:介绍如何声明和使用变量、常量,以及它们的存储类别和生命周期。运算符与表达......
  • 【数据结构】单链表-->详细讲解,后赋源码
    欢迎来到我的Blog,点击关注哦......
  • Springboot计算机毕业设计一次性环保餐具销售系统小程序【附源码】开题+论文+mysql+程
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:随着外卖和快餐文化的快速发展,一次性餐具的使用量急剧增加,给环境带来了沉重的负担。传统的一次性餐具多为塑料制品,难以降解,对环境造成了长期污染。因......
  • Springboot计算机毕业设计药品外送小程序【附源码】开题+论文+mysql+程序+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景:在当今快节奏的生活环境中,人们对便捷性的需求日益增长。特别是在医疗健康领域,当患者因疾病需要药品时,能够迅速获得所需药物显得至关重要。随着互联网......
  • JAVA计算机毕业设计基于Vue学生选课管理系统(附源码+springboot+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在现代高等教育体系中,学生选课管理是一项复杂且至关重要的工作。随着学生人数的不断增加和课程种类的日益丰富,传统的手工选课管理方式已经无法满足高......
  • JAVA计算机毕业设计基于vue图书馆选座系统设计与实现(附源码+springboot+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着高校图书馆的日益繁忙和学生对学习环境需求的提高,图书馆座位管理成为了一个亟待解决的问题。传统的图书馆座位管理方式往往存在效率低下、资源浪......
  • 【vue源码】虚拟DOM和diff算法
    虚拟DOM与AST抽象语法树的区别虚拟DOM是表示页面状态的JavaScript对象,(虚拟DOM只有实现diff算法)而AST是表示代码语法结构的树形数据结构。虚拟DOM通常用于优化页面渲染性能,而AST通常用于进行代码静态分析、代码转换等操作。(AST主要执行compiler编译)什么是虚拟DOM?用JavaSc......
  • Large Language Models are Zero-Shot Rankers for Recommender Systems论文阅读笔记
    LargeLanguageModelsareZero-ShotRankersforRecommenderSystems论文阅读笔记Abstract​ 本工作旨在调查作为推荐系统的排名模型的LLM的能力。我们首先将推荐问题形式化为一个条件排序任务,将顺序交互历史作为条件,并将其他候选生成模型检索到的项目作为候选项。为了解决LL......
  • openeuler源码安装Postgresql 16
    准备条件OpenEuler(虚拟机):版本:22.03-LTS-SP3下载地址:https://www.openeuler.org/zh/download/PostgreSQL:版本:16.3源码包下载地址:https://www.postgresql.org/ftp/source/操作系统安装安装过程与centos基本一致,此处就省略了,安装的时候可以把需要的网络工具和开发工具包勾......
  • 开源多企业AI智能名片小程序源码中的市场细分策略分析
    摘要:在数字化营销的新时代,开源多企业AI智能名片小程序源码为众多企业提供了快速构建智能名片系统的能力。其中,市场细分作为营销策略的重要组成部分,对于提高营销效果、满足消费者需求具有重要意义。本文将以开源多企业AI智能名片小程序源码为背景,探讨市场细分中的行为细分和心......