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);
    }
}
相关推荐
Am心若依旧40914 分钟前
[c++11(二)]Lambda表达式和Function包装器及bind函数
开发语言·c++
明月看潮生17 分钟前
青少年编程与数学 02-004 Go语言Web编程 20课题、单元测试
开发语言·青少年编程·单元测试·编程与数学·goweb
Yan.love23 分钟前
开发场景中Java 集合的最佳选择
java·数据结构·链表
椰椰椰耶26 分钟前
【文档搜索引擎】搜索模块的完整实现
java·搜索引擎
大G哥26 分钟前
java提高正则处理效率
java·开发语言
冠位观测者33 分钟前
【Leetcode 每日一题】2545. 根据第 K 场考试的分数排序
数据结构·算法·leetcode
VBA633737 分钟前
VBA技术资料MF243:利用第三方软件复制PDF数据到EXCEL
开发语言
轩辰~38 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
小_太_阳1 小时前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
向宇it1 小时前
【从零开始入门unity游戏开发之——unity篇02】unity6基础入门——软件下载安装、Unity Hub配置、安装unity编辑器、许可证管理
开发语言·unity·c#·编辑器·游戏引擎