「Java数据结构」- 栈和队列

本文详细介绍了如何在Java中实现栈和队列的操作,包括出栈、入队、判断栈/队列是否为空的方法,以及基于数组和链表的不同实现策略,讨论了时间复杂度。还提到了数据结构在实际编程中的应用和重要性。
摘要由CSDN通过智能技术生成

if (this.top == 0) {

throw new UnsupportedOperationException(“栈中元素为空!”);// 手动抛一个异常 提示

}

return this.elem[this.top - 1]; // 返回top - 1 的元素,不改变 top 本身

}

出栈


出栈操作,使用的是覆盖方法,将当前 top 指针往下一位,等下次 添加元素的时候就能覆盖当前要删除的元素,即使没有要添加的元素,由于 top 指针变了,当前其它操作也访问不到删除的元素,所以移动 top 指针既可达到我们逻辑上的删除.

public int pop() {

if (this.top == 0) {

throw new UnsupportedOperationException(“栈顶元素为空”);

}

return this.elem[–this.top];// 将 top 指针下移一位,切返回当前的要删除的元素

}

栈是否为空


判断当前 top 是否等于 0 即可

public boolean empty() {

return this.top == 0;

}

栈的使用

====

实现完方法之后,接下来简单了解一下栈的使用方法

public static void main(String[] args) {

MyStack myStack = new MyStack();

Stack stack = new Stack<>();

myStack.push(1);

myStack.push(2);

myStack.push(3);

myStack.push(4);

myStack.push(5);

while (!myStack.empty()){

System.out.print(myStack.pop() + " ");

}

}

由于添加的顺序是 1 -> 2 -> 3 -> 4 -> 5 , 根据后进先出的特性,输出 应该为 5 -> 4 -> 3 -> 2 -> 1

以上就是关于如何使用 JAVA 实现 栈 的所有内容,接下来我们去学习一下 另外一种数据结构 <队列>


队列的认识

=========

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表

入队列:进行插入操作的一端称为队尾(Tail)

出队列:进行删除操作的一端称为队头(Head)

队列是一个具有先进先出特性的数据结构

队列的功能

=========

队列这种特殊的数据结构的特性,在现实生活中很多也很常见,拿火车站买票来说,先到售票窗口前的人能先买到票,后到购票窗口的人只能排队等先到的人买完才能买,队列也是,只有先入队列的元素出队列之后,后面入队列的元素才能出队列,不允许随机访问元素

public boolean isEmpty() // 判断队列是否为空

public void offer(E e) // 入队列,则将指定的元素插入到此队列中。

public int peek() // 返回队头元素

public int poll() // 出队列,删除队头元素,并返回改值

上面就是队列的常用方法,在实现功能前,我们先考虑是用数组来实现队列,还是用链表来实现比较好?我们可以比较一下两种结构的时间复杂度

  1. 入队列:入队列的时候使用的是尾插法
1.  数组:用数组实现尾插法 , 使用一个指针记录尾部 , 进行插入时直接通过尾部指针进行插入 , 不需要格外的遍历 , 时间复杂度为 O(1).
2.  链表:用链表实现尾插法 , 使用一个尾节点记录尾部 , 进行插入时直接通过尾节点进行插入,不需要格外的遍历 , 时间复杂度为 O(1)
  1. 出队列:出队列的时候使用的是头删法
1.  数组:用数组实现头删法 , 需要将后面的数据覆盖前面的数据 , 时间复杂度是O(N)
2.  链表:用链表实现头删法,只需要使用一个头节点记录对头位置 , 删除时 将头节点指向当前对头的下一个节点即可

由此得出,在实现队列使用的存储方式时,使用链表的时间复杂度更低,那就先创建一个节点类,用来存储数据及下一个节点的地址

public class MyQueue {

// 可以使用内部类,定义在实现类里面

private static class Node {

public int val;

public Node next;

public Node(int val) {

this.val = val;

}

}

private Node head;// 记录头节点

private Node tail; // 记录尾节点

}

实现

======

入队列


入队列分为两种情况

  1. 第一次入队列,队列是为空的,需要先将头节点和尾节点都指向当前的节点

  1. 非第一次队列,需要将 tail 的 next 指针指向 当前插入的节点,且 tail 节点 也要更新成当前节点

public void offer(int val) {

// 创建新节点

Node node = new Node(val);

//尾插法 需要判断是不是第一次插入

if (isEmpty()) {

this.head = node;

this.tail = node;

return;

}

this.tail.next = node;

this.tail = node;

}

出队列


出队列也分两种情况

  1. 队列为空:如果队列为空,调用出队列的方法时,我们应该抛出一个异常提示

  2. 队列不为空:队列不为空,采用头删法,将 head 节点 更新成 head.next 的节点,此时就能达到删除队头元素的效果了.

public int poll() {

//判断是否为空队列的

if (isEmpty()) {

throw new UnsupportedOperationException(“队列为空”);

}

// 记录要删除对头的元素

int ret = this.head.val;

// 更改 head 指向

this.head = this.head.next;

return ret;

}

取对头元素


我们在前面使用了 head 引用,记录了 队头,所以只需要放回 head 引用的值即可,需要判断队列是否为空,为空的话需要抛出异常提示

public int peek() {

//不要移动first

if (isEmpty()) {

throw new UnsupportedOperationException(“链表为空”);

}

return this.head.val;

}

判断队列是否为空


判断 head 引用 或者 tail 引用是否 == null 即可

public boolean isEmpty() {

return this.head == null;

}

队列的使用

======

简单添加几个数据并输出,测试队列能否正常使用

public static void main(String[] args) {

MyQueue myQueue = new MyQueue();

myQueue.offer(1);

myQueue.offer(2);

myQueue.offer(3);

myQueue.offer(4);

myQueue.offer(5);

while (!myQueue.isEmpty()){

System.out.print(myQueue.poll() + " ");

}

}

添加元素顺序为 1 -> 2 -> 3 -> 4 -> 5 , 根据先进先出的特性, 输出的顺序也应该为 1 -> 2 -> 3 -> 4 -> 5


自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
码获取!!(备注Java获取)**

img

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

[外链图片转存中…(img-L3qBNfkM-1713518049996)]

[外链图片转存中…(img-9dpfRmpf-1713518049998)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 15
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值