Java基础 数据结构一【栈、队列】

什么是数据结构

数据结构是计算机科学中的一个重要概念,用于组织和存储数据以便有效地进行访问、操作和管理。它涉及了如何在计算机内存中组织数据,以便于在不同操作中进行查找、插入、删除等操作

数据结构可以看作是一种数据的组织方式,不同的数据结构适用于不同的应用场景,根据操作的需求和效率要求,选择合适的数据结构可以提高算法的执行效率。

1. 栈(Stack)

栈(Stack) 一种具有后进先出(LIFO)特性的数据结构,常用于处理函数调用、表达式求值等。

代码实现(Java)

java 复制代码
import java.util.Arrays;
import java.util.Objects;

public class Stack {
    private static final int DEFAULT_CAPACITY = 10;
    Object[] objects = new Object[DEFAULT_CAPACITY];
    int subscript = 0;
    /**
     * 将元素压入栈顶
     * 入栈
     * @param element 要压入的元素
     */
    @Override
    public void push(Object element) {
        ensureCapacity();
        objects[subscript] = element;
        subscript ++;
    }

    /**
     * 弹出栈顶元素并返回
     * 把栈顶元素删除,并返回
     * 出栈
     * @return 弹出的栈顶元素, 如果栈为空返回 null
     */
    @Override
    public Object pop() {
        if (subscript == 0) {
            return null;
        } else {
            Object obj = objects[--subscript];
            objects[subscript] = null;
            return obj;
        }
    }

    /**
     * 返回栈顶元素,但不弹出
     * @return 栈顶元素
     */
    @Override
    public Object peek() {
        return objects[subscript - 1];
    }

    /**
     * 检查栈是否为空
     * @return 如果栈为空则返回true,否则返回false
     */
    @Override
    public boolean isEmpty() {
        return subscript == 0;
    }

    /**
     * 返回栈中的元素个数
     * @return 栈中元素的个数
     */
    @Override
    public int size() {
        return subscript;
    }

    // 扩容
    private void ensureCapacity() {
        if (subscript == objects.length) {
            int newCapacity = objects.length * 2;
            objects = Arrays.copyOf(objects, newCapacity);
        }
    }

    @Override
    public String toString() {
        Object[] tempArrays = new Object[subscript];
        System.arraycopy(objects, 0, tempArrays, 0, subscript);
        return Arrays.toString(tempArrays);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null || obj.getClass() != this.getClass()) {
            return false;
        }
        if (obj == this) {
            return true;
        }
        // 判断大小是否相等
        StackPractice other = (StackPractice) obj; // 对象类型匹配,进行类型转换
        if (other.size() != this.size()) {
            return false;
        }
        // 比较两个栈的底层数组是否相等。
        return Arrays.equals(this.objects, other.objects);
    }

    @Override
    public int hashCode() {
        return Objects.hash(Arrays.hashCode(objects), subscript);
    }
}

2. 队列(Queue)

一种具有先进先出(FIFO)特性的数据结构,常用于任务调度、广度优先搜索等。

代码实现(Java)

java 复制代码
import java.util.Arrays;
import java.util.Objects;

public class QueuePractice extends Queue {
    private static final int DEFAULT_CAPACITY = 10;
    Object[] objects = new Object[DEFAULT_CAPACITY];
    int size = 0;
    /**
     * 将元素插入队尾
     * @param element 要插入的元素
     */
    @Override
    public void enqueue(Object element) {
        objects[size] = element;
        size ++;
    }

    /**
     * 移除并返回队首元素
     * 删除第一个元素,并返回
     * @return 队首元素, 如果队列为空时,返回 null
     */
    @Override
    public Object dequeue() {
        if (size == 0) {
            return null;
        } else {
            Object obj = objects[0];
            size --;
            System.arraycopy(objects, 1, objects, 0, size);
            return obj;
        }
    }

    /**
     * 返回队首元素,但不移除
     * @return 队首元素
     */
    @Override
    Object peek() {
        return objects[0];
    }

    /**
     * 检查队列是否为空
     * @return 如果队列为空则返回true,否则返回false
     */
    @Override
    boolean isEmpty() {
        return size == 0;
    }

    /**
     * 返回队列中的元素个数
     * @return 队列中元素的个数
     */
    @Override
    int size() {
        return size;
    }

    @Override
    public String toString() {
        Object[] tempArrays = new Object[size];
        System.arraycopy(objects, 0, tempArrays, 0, size);
        return Arrays.toString(tempArrays);
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (obj == null || obj.getClass() != this.getClass()) {
            return false;
        }
        // 判断大小是否相等
        QueuePractice other = (QueuePractice) obj; // 对象类型匹配,进行类型转换
        if (other.size() != this.size()) {
            return false;
        }
        // 比较两个栈的底层数组是否相等。
        return Arrays.equals(this.objects, other.objects);
    }

    @Override
    public int hashCode() {
        return Objects.hash(Arrays.hashCode(objects), size);
    }
}
相关推荐
在努力的前端小白5 分钟前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
麦兜*1 小时前
Swift + Xcode 开发环境搭建终极指南
开发语言·ios·swiftui·xcode·swift·苹果vision pro·swift5.6.3
pusue_the_sun2 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
萧鼎2 小时前
Python pyzmq 库详解:从入门到高性能分布式通信
开发语言·分布式·python
一叶飘零_sweeeet2 小时前
从繁琐到优雅:Java Lambda 表达式全解析与实战指南
java·lambda·java8
艾伦~耶格尔3 小时前
【集合框架LinkedList底层添加元素机制】
java·开发语言·学习·面试
yujkss3 小时前
Python脚本每天爬取微博热搜-终版
开发语言·python
yzx9910133 小时前
小程序开发APP
开发语言·人工智能·python·yolo
一只叫煤球的猫3 小时前
🕰 一个案例带你彻底搞懂延迟双删
java·后端·面试
最初的↘那颗心3 小时前
Flink Stream API 源码走读 - print()
java·大数据·hadoop·flink·实时计算