Java手搓数据结构:栈与队列模拟实现

📚 目录

1. 认识栈

  栈:我们能看作一个水杯,水杯里面装着水(就相当于水杯中装的是我们想要存储的值)。

概念:

  特殊线性表,只允许在一端插入或者删除元素。

  特殊性:先进的元素后出。(插入:入栈;删除:出栈)

  Java官方提供的相关栈(Stack)操作:

[🔙 返回目录](#🔙 返回目录)


2. 模拟实现栈

java 复制代码
public class MyStack<E> {
    public Object[] array;
    //栈中真实元素的大小
    public int size;
    //初始化数组长度为5
    public MyStack() {
        array = new Object[5];
    }
 }   

  栈的模拟我们使用数组来实现。

入栈

  添加时需要判断当前的数组是否满了,满了就需要进行扩容。

java 复制代码
    //入栈
    public E push(E val) {
        //判断当前栈是否满,满了就需要扩容
        if(size==array.length) {
            array = Arrays.copyOf(array,2*array.length);
        }
        array[size++] = val;
        return val;
    }

  结果:

出栈
java 复制代码
    //出栈
    public E pop() {
        //判断是否为空
        if(empty()) {
            throw new RuntimeException("栈为空");
        }
        E val = (E)array[size-1];
        size--;
        return val;
    }

  结果:

获取栈顶元素

  首先判断当前栈是否为空,如果不为空直接返回size-1下标位置的元素。

java 复制代码
    //获取栈顶元素
    public E peek() {
        if(empty()) {
            throw new RuntimeException("栈为空");
        }
        return (E)array[size-1];
    }

  结果:

判断栈是否为空

  此时只需要判断size的个数是否为0,即可:

java 复制代码
    public boolean empty() {
        return size == 0;
    }

  结果:

[🔙 返回目录](#🔙 返回目录)


3. 认识队列

  队列:我们能将队列想象成一个倒着的水杯。

  为什么要看出倒着的水杯?

  倒着的水杯无论你加多少滴水进去,都是第一个进去的水滴先掉出来。

概念:

  一种特殊的线性表,一端进行插入,一段进行删除的特殊线性表。

  特殊性:先进先出。

  Java官方提供的队列相关操作:

[🔙 返回目录](#🔙 返回目录)


4. 模拟实现队列

  模拟队列的实现我们采用链表的形式来模拟实现。

java 复制代码
public class MyQueue <E>{
    //创建节点
    static class ListNode<E> {
        public ListNode<E> next;//前一个节点
        public ListNode<E> prev;//后一个节点
        public E val;//存储的值
        public ListNode(E val) {
            this.val = val;
        }
    }
    ListNode<E> first;//队头
    ListNode<E> last;//队尾
    public int size;//大小
}    
入队

  每次插入都在队尾进行插入,第一次插入时需要额外的判断。

java 复制代码
    //入队
    public void offer(E e) {
        ListNode<E> listNode = new ListNode<>(e);
        //判断队列是否为第一次添加数据
        if(first==null) {
            first = listNode;
        }else {
            last.next = listNode;
            listNode.prev = last;
        }
        //让尾巴节点移动
        last = listNode;
        size++;
    }

  结果:

出队
java 复制代码
   //出队
    public E poll() {
        //判断队列是否为空
        if(isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        E val = first.val;
        //判断队首和队尾是否相等
        if(first == last) {
            first = null;
            last = null;
        }else {
            first = first.next;
            first.prev.next = null;
            first.prev = null;
        }
        //长度减小
        size--;
        //返回要删除的值
        return val;
    }

  结果:

获取队头元素

  和栈类似,都需要判断当前的队列是否为空。

java 复制代码
    //获取队头元素不删除
    public E peek() {
        //如果队列为空则报异常
        if(isEmpty()) {
            throw new RuntimeException("队列为空");
        }
        //返回队列的元素
        return first.val;
    }

  结果:

判断队列是否为空

  直接判断first是否为空,或者判断size大小是否为0。

java 复制代码
    public boolean isEmpty() {
        return first == null;
    }

  结果:

[🔙 返回目录](#🔙 返回目录)


相关推荐
en.en..17 小时前
数据结构考点解析:逻辑闭环与存储循环辨析
数据结构
考虑考虑18 小时前
Excel导入时产生特殊字符处理
java·后端·java ee
Scabbards_18 小时前
面试Leetcode - Heap 堆
java·leetcode·面试
程序员清风19 小时前
专业再升级!程序员专属显示器明基RD280UG上手实测!
java·后端·面试
启雀AI19 小时前
培训平台移动端离线学习方案设计与实现:视频缓存、断点续传与进度同步的工程实践
android·学习·缓存·音视频·企业lms
布莱克60520 小时前
数据库索引分类:数据结构、物理存储与逻辑角度详解
数据结构·数据库
Lam Tang20 小时前
APS 系列文章 08
java·代理模式
Fa_Mian_Tuan20 小时前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
Bruce_Liuxiaowei21 小时前
从零到可运行:基于 Vue3 + FastAPI + DeepSeek-V3 的 AI 英语单词学习系统全栈实战
人工智能·python·学习·fastapi·全栈·智能体
萧瑟余晖21 小时前
Java深入解析篇三十三之消息队列
java·开发语言