广告
返回顶部
首页 > 资讯 > 后端开发 > Python >java数据结构基础:栈
  • 928
分享到

java数据结构基础:栈

2024-04-02 19:04:59 928人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录准备工作编码环节push方法pop方法empty方法全部代码总结准备工作 工具:idea+jdk8 技术要求:Java基础语法 编码环节 首先,我们得先确定下来,用什么数据来模拟

准备工作

工具idea+jdk8

技术要求:Java基础语法

编码环节

首先,我们得先确定下来,用什么数据来模拟栈的操作。由于是一个一个的元素放入栈里面,我们可以考虑用数组来实现。

在这里插入图片描述

以上是Java官方文档中的栈定义,我们也只需要实现三个方法:判断是否为空、移除栈顶对象、添加元素到栈的尾部

所以我们事先得定义一个数组:


Objects[] arr;

数组定义好了之后呢,想想,我们怎么去获取到栈尾部或者栈首的元素呢?还记得数组的索引吗?可以用索引来假设为栈的指针。所以,我们还得定义好栈的元素个数和栈的默认长度以及默认的指针:


private int stackLength = 4; // 数组的默认长度
private int size; // 记住栈容器的元素个数
private int index = -1; // 操作数组下标位置的指针

为什么这儿指向的是-1呢?我们知道,数组的第一个元素是索引为0,那么-1的意思就是不指向任何元素。待会儿我们在用的时候再去指向他。

然后,我们还得定义出数组的初始化。以及初始化的长度。参考官方文档的写法,当栈的长度满了之后我们就对栈长度进行1.5倍的扩容。我们就单独提取出一个方法来放置;



private void capacity() {
    // 数组初始化
    if (this.arr == null) {
        this.arr = new Object[this.stackLength];
    }
    // 以1.5倍对数组扩容
    if (this.size - (this.stackLength - 1) >= 0) { // 如果当前数组的元素个数大于了当前数组的最后一个索引值
        this.stackLength = this.stackLength + (this.stackLength >> 1); // 位运算,让长度变成原来的1/2
        this.arr = Arrays.copyOf(this.arr, this.stackLength); // 复制一个新的数组,用新开辟的长度
    }
}

push方法

如何给栈添加元素?我们要考虑的地方:指针向右移动一位,也就是说指针要+1。其次,添加完元素之后,栈元素的长度发生了变化,size+1 。


public E push(E item){
    // 先初始化数组
    this.capacity();
    // 添加元素
    this.arr[++index] = item;
    // 记录元素个数加一
    this.size++;
    return item;
}

pop方法

pop方法主要是用来移除栈顶的元素。

先分析一下思路:我们要用index去指向栈顶的元素,该怎么去指定?

删除之后,对应的size长度该怎么去改变?

我们知道,当元素添加了之后,index会跟着改变,那么就好比我们添加了三个元素,此时的index应该就是指向的2。那就好办了。

当移除的时候,我们只需要让index–来操作就能解决问题;看代码:



public E pop() {
    // 如果栈容器中没有元素则抛出异常
    if (this.index == -1) {
        throw new EmptyStackException();
    }
    // 记录元素个数
    this.size--;
    // 返回栈顶元素
    System.out.println("删除元素之前的当前下标:"+index);
    return (E) this.arr[index--];
}

empty方法

判断栈是否为空,这很简单。直接判断当前的size是不是0就能解决:


public boolean empty(){
	return this.index==0?true:false;
}

全部代码


package com.zxy;
import java.util.Arrays;
import java.util.EmptyStackException;

public class MyStack<E> {
    private Object[] arr; // 存放元素的物理结构
    private int stackLength = 4; // 数组的默认长度
    private int size; // 记住栈容器的元素个数
    private int index = -1; // 操作数组下标位置的指针
    
    public boolean empty() {
        return this.size == 0 ? true : false;
    }
    
    public E pop() {
        // 如果栈容器中没有元素则抛出异常
        if (this.index == -1) {
            throw new EmptyStackException();
        }
        // 记录元素个数
        this.size--;
        // 返回栈顶元素
        System.out.println("删除元素之前的当前下标:"+index);
        return (E) this.arr[index--];
    }

    
    public E push(E item) {
        // 初始化数组
        this.capacity();
        // 向数组中添加元素
        System.out.println("添加元素之前的下标:"+index);
        this.arr[++index] = item;
        System.out.println("添加元素之后的下标:"+index);
        // 记录元素个数
        this.size++;
        return item;
    }
    
    private void capacity() {
        // 数组初始化
        if (this.arr == null) {
            this.arr = new Object[this.stackLength];
        }
        // 以1.5倍对数组扩容
        if (this.size - (this.stackLength - 1) >= 0) { // 如果当前数组的元素个数大于了当前数组的最后一个索引值
            this.stackLength = this.stackLength + (this.stackLength >> 1); // 位运算,让长度变成原来的1/2
            this.arr = Arrays.copyOf(this.arr, this.stackLength); // 复制一个新的数组,用新开辟的长度
        }
    }
    public static void main(String[] args) {
        MyStack<String> stack = new MyStack<>();
        stack.push("a");
        stack.push("b");
        stack.push("c");
        System.out.println(stack.size);
        System.out.println("当前栈顶元素:"+stack.pop());
        
    }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望能够您能够关注编程网的更多内容!

--结束END--

本文标题: java数据结构基础:栈

本文链接: https://www.lsjlt.com/news/131252.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java数据结构基础:栈
    目录准备工作编码环节push方法pop方法empty方法全部代码总结准备工作 工具:idea+jdk8 技术要求:java基础语法 编码环节 首先,我们得先确定下来,用什么数据来模拟...
    99+
    2022-11-12
  • java数据结构基础:循环链表和栈
    目录循环链表:实现思路:代码实现:栈:实现思路:代码实现:总结循环链表: 与单链表的最后一个节点的指针域为null不同,循环链表的最后一个节点的指针指向头结点 实现思路: 初始化时将...
    99+
    2022-11-12
  • java数据结构基础:绪论
    目录基本概念和术语数据数据元素数据项数据对象结构数据结构逻辑结构与物理结构逻辑结构物理结构抽象数据类型总结基本概念和术语 要想知道数据结构是什么,我们首先得去知道,数据和结构是什么;...
    99+
    2022-11-12
  • java数据结构基础:算法
    目录数据结构和算法关系高斯求和算法定义算法的特性算法设计的要求算法效率的度量方法函数的渐进增长总结数据结构和算法关系 虽然这个标题起的叫数据结构,但是我却总结算法。。。我不是没事找抽...
    99+
    2022-11-12
  • Java常见基础数据结构
    目录栈:队列:数组:链表:红黑树:总结栈: stack,又称堆栈,他是运算受限的线性表,其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。 ...
    99+
    2022-11-12
  • java数据结构基础:线性表
    目录前言需求分析编码add方法getIndex方法pop方法insert方法getAll全部代码总结前言 其实线性表在生活中和栈的结构差不多。昨天总结了一篇单链表,也是线性表的一种。...
    99+
    2022-11-12
  • java数据结构基础:稀疏数组
    目录稀疏数组:实现思路:举例:二维数组转稀疏数组实现思路:稀疏数组恢复二维数组实现思路:代码实现:输出结果:总结稀疏数组: 当一个二维数组中大部份的值为0,或者为同一值的时候,可以用...
    99+
    2022-11-12
  • Java数据结构01——栈
    一、栈         1、栈的性质                 栈(stack)是限定仅在表尾进行插入或者删除的线性表。对于栈来说,表尾端称为栈顶(top),表头端称为栈低(bottom)。不含元素的空表称为空栈。因为栈限定在表尾进行...
    99+
    2023-09-20
    数据结构 java 开发语言
  • Redis基础数据结构
    Redis数据结构:String、Hash、List、Set、ZSet(每种数据结构均包含两种以上的内部编码) Redis单线程架构: 1. 纯内存访问 2. 非阻塞I/O (采用多路复用技术epoll) 3. 减少了线程切换和竞态产生的消...
    99+
    2016-07-28
    Redis基础数据结构
  • 【数据结构】Java实现栈
    目录 1. 概念 2. 栈的使用  3. 自己动手实现栈(使用动态数组实现栈)  1. 创建一个MyStack类 2. push入栈 3. pop出栈 4. 查看栈顶元素 5. 判断栈是否为空与获取栈长 6. toString方法 4. 整...
    99+
    2023-10-27
    数据结构 jvm java
  • 疯狂数据结构-栈-Java
    概念 基本概念解读 当谈到 "栈" 时,它是一种遵循后进先出(Last In, First Out,LIFO)原则的有序集合。这意味着最后入栈的元素首先被弹出,而最早入栈的元素最后被弹出。在栈中,只能对最上面的元素进行操作,其他元素都不可见...
    99+
    2023-08-16
    数据结构 java 开发语言
  • java数据结构基础:单,双向链表
    目录单向链表单链表图解代码双向链表编码总结单向链表 单向链表比顺序结构的线性表最大的好处就是不用保证存放的位置,它只需要用指针去指向下一个元素就能搞定。 单链表图解 图画的比较粗糙...
    99+
    2022-11-12
  • Java常见基础数据结构有哪些
    这篇文章主要介绍Java常见基础数据结构有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!栈:stack,又称堆栈,他是运算受限的线性表,其限制是仅允许在表的一端进行插入和删除操作,不允许在其他任何位置进行添加、查...
    99+
    2023-06-20
  • Java数据结构之栈的线性结构详解
    目录一:栈二:栈的实现三:栈的测试四:栈的应用(回文序列的判断)总结一:栈 栈是限制插入和删除只能在一个位置上进行的表,此位置就是表的末端,叫作栈顶。 栈的基本操作分为push(入...
    99+
    2022-11-12
  • 数据结构(二):栈
    栈:后进先出(LIFO)表。 特点:只允许在顶部进行存取操作的顺序表。 基本操作: push:入栈,即将元素压入栈顶 pop:出栈,即将栈顶元素删除 top:输出栈顶元素 应用场景: 平衡符号:编译器中用于检查符号是否成对出现,方...
    99+
    2023-01-31
    数据结构
  • java数据结构之栈的详解
    目录一、栈1.栈的应用1.1括号匹配1.2后缀表达式1.3用栈实现队列1.4最小栈1.5栈的压入和弹出序列总结一、栈 栈的特性就是先进后出,常用方法是入栈(push()),出栈(po...
    99+
    2022-11-12
  • java 数据结构之栈与队列
    java 数据结构之栈与队列一:对列队列是一种先进先出的数据结构实现代码:package Queue; public class Queue { //队列类 private int maxSize; //定义队列的长度 ...
    99+
    2023-05-31
    java 队列
  • Java基础-Java的体系结构
    目录1 前言1. 1 Java技术平台1.2 Java开源文化1.3 Java强大社区2 Java体系结构的组成2.1 Java编程语言2.2 字节码2.3 Java API2.4 ...
    99+
    2022-11-12
  • Python基础之数据结构详解
    目录一、列表1.1 列表更新元素1.2 列表增加元素1.3 列表删除元素1.4 列表的其他操作二、元组2.1 删除元组2.2 元组的其他操作三、字典3.1 字典删除元素3.2 字典的...
    99+
    2022-11-12
  • C++LeetCode数据结构基础详解
    目录一、只出现一次的数字二、多数元素三、三数之和总结一、只出现一次的数字 遍历一遍数组利用异或的特性来实现(相同为0,相异为1 ) 例如[4,1,2,1,2] 4和1异或为5 5和...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作