【数据结构】模拟实现栈和队列

文章目录

  • 栈(Stack)
    • 栈的概念
    • 栈的常用方法
    • 模拟实现栈
  • 队列(Queue)
    • 队列的概念
    • 队列的常用方法
    • 队列的模拟实现
    • 循环队列模拟实现

栈(Stack)

栈的概念

栈是一种特殊的线性表,只允许在固定的一端进行插入和删除操作,进行数据插入和删除的一端称为栈顶,另一端称为栈底。栈的数据遵循后进先出LIFO(Last In First Out)的原则。

压栈:栈的插入操作叫做压栈/进栈/入栈,入的数据在栈顶。

出栈:栈的删除操作叫做出栈,出的数据在栈顶。
在这里插入图片描述

栈的常用方法

//入栈
public void push(int val)//将栈顶元素出栈并返回
public int pop()//获取栈顶元素
public int peek()//检测栈是否为空
public boolean isEmpty()

模拟实现栈

构造一个空栈

public class MyStack {private int[] elem;private int usedSize;//栈的实际元素个数private static final int DEFAULT_CAPACITY = 10;//初始化栈的大小为DEFAULT_CAPACITYpublic MyStack() {this.elem = new int[DEFAULT_CAPACITY];}
}

实现push方法(入栈)

public void push(int val) {//判断栈是否已满 满就扩容if (this.elem.length == usedSize) {this.elem = Arrays.copyOf(this.elem,this.elem.length*2);}this.elem[usedSize] = val;usedSize++;
}

实现pop方法(将栈顶元素出栈并返回)

如果栈为空,返回栈顶元素就会报错,我们可以自定义一个异常用来解决报错问题

public class emptyException extends RuntimeException {public emptyException() {}public emptyException(String message) {super(message);}
}
public int pop() {//如果为空栈就抛出一个异常if (usedSize==0){throw new emptyException();}int oldVal = this.elem[usedSize-1];usedSize--;return oldVal;
}

实现peek方法(获取栈顶元素)

public int peek() {//如果为空栈就抛出一个异常if (usedSize==0){throw new emptyException();}return this.elem[usedSize-1];
}

实现isEmpty方法(检测栈是否为空)

public boolean isEmpty() {//判断栈是否为空 只需要判断栈的实际元素个数是否为0即可return usedSize==0;
}

队列(Queue)

队列的概念

队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列遵循先进先出FIFO(First in First Out)的原则。在Java里面Queue 是一个接口,底层是通过链表实现的。

入队列:进行插入的一端称为队尾。

出队列:进行删除的一端称为队头。
在这里插入图片描述

队列的常用方法

//入队
public void offer(int x)//出队
public int poll()//获取队头元素x
public int peek()//获取队列中有效元素的个数
public int size()//检测队列是否为空
public boolean isEmpty()

队列的模拟实现

双链表模拟实现队列

public class MyQueue {static class ListNode {public int val;public ListNode next;public ListNode prev;public ListNode(int val) {this.val = val;}}public ListNode front;//队头public ListNode rear;//队尾public int usedSize = 0;//队列实际元素个数}

实现offer方法(入队)

public void offer(int x) {ListNode node = new ListNode(x);//队列为空if (front==null){front=rear=node;}else {node.next=front;front.prev=node;front=node;}usedSize++;
}

实现poll方法(出队)

public int poll(){//队列为空if (front==null){return -1;}int ret = rear.val;//队列中只有一个元素if (front==rear){front=null;rear=null;usedSize--;return ret;}//删除尾节点rear=rear.prev;rear.next=null;usedSize--;
}

实现peek方法(获取队头元素)

public int peek(){if (front==null){return -1;}return front.val;
}

实现size方法(获取队列中有效元素的个数)

public int size(){return usedSize;
}

实现isEmpty方法(检测队列是否为空)

public boolean isEmpty(){return front==null;
}

循环队列模拟实现

在这里插入图片描述

在这里插入图片描述

public class MyCircularQueue {public int[] elem;public int front;//队头public int rear;//队尾//构造循化队列public MyCircularQueue(int len) {this.elem = new int[len+1];}//入队public boolean enQueue(int val){//判断队列是否装满if (isFull()){return false;}elem[rear] = val;rear = (rear+1)%elem.length;return true;}//检测队列是否装满private boolean isFull() {return (rear+1)%elem.length==front;}//出队public boolean deQueue(){if (isFull()){return false;}front = (front+1)%elem.length;return true;}//获取队头元素public int getFront(){if (isEmpty()){return -1;}return elem[front];}//检测队列是否为空public boolean isEmpty(){return front==rear;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/171284.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网盘限速问题解析:哪家网盘真的不限速?

天下苦网盘限速久矣。市面上一些网盘工具要不然是收费限流,要不然是需要额外购买下载券。哪家网盘真的不限速? Zoho Workdrive 企业网盘是真正的不限速网盘,上传和下载文件都不限速,真正做到用户的网速有多快,下载就有…

Android笔记(八):基于CameraX库结合Compose和传统视图组件PreviewView实现照相机画面预览和照相功能

CameraX是JetPack库之一,通过CameraX可以向应用增加相机的功能。在下列内容中,将介绍一个结合CameraX实现一个简单的拍照应用。本应用必须采用Android SDK 34。并通过该简单示例,了解传统View层次组件的UI组件如何与Compose组件结合实现移动应…

大数据-Storm流式框架(三)--Storm搭建教程

一、两种搭建方式 1、storm单节点搭建 2、完全分布式搭建 二、storm单节点搭建 准备 下载地址:Index of /dist/storm 1、环境准备: Java 6 Python 2.6.6 2、上传、解压安装包 3、在storm目录中创建logs目录 mkdir logs 启动 ./storm help …

是谁在造谣杭州取消直播带货?

我是卢松松,点点上面的头像,欢迎关注我哦! 这个世道,谣言的传播成本很低:比如“杭州禁止直播带货”这件事。 就在今天若水跟我说:“杭州禁止直播是谣言了,辟谣了”让我也赶紧隐藏或删除内容&…

Linux - 进程的优先级 和 如何使用优先级调度进程

理解linux 当中如何做到 把一个PCB 放到多个 数据结构当中 在Linux 当中,一个进程的 PCB 不会仅仅值存在一个 数据结构当中,他既可以在 某一个队列当中,又可以在 一个 多叉树当中。 队列比如 cpu 的 运行队列,键盘的阻塞队列等等…

C# Socket通信从入门到精通(4)——多个异步TCP客户端C#代码实现

前言: 在之前的文章C# Socket通信从入门到精通(3)——单个异步TCP客户端C#代码实现我介绍了单个异步Tcp客户端的c#代码实现,但是有的时候,我们需要连接多个服务器,并且对于每个服务器,我们都有一些比如异步连接、异步发送、异步接收的操作,那么这时候我们使用之前单个…

JAVA实现生活废品回收系统 开源

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 资源类型&资源品类模块3.3 回收机构模块3.4 资源求购/出售/交易单模块3.5 客服咨询模块 四、免责说明 一、摘要 1.1 项目介绍 生活废品回收系统是可持续发展的解决方案,旨在鼓…

LVS集群-DR模式

概念: LVS-DR模式,也是最常用的lVS负载方式,DR DIRECT ROUTING 直接路由模式 负载均衡器lVS调度器,只负责请求和转发到后端的真实服务器,但是影响结果,由后端服务器直接转发给客户端,不需要经…

NTRU 加密方案

参考文献: [Rivest97] Rivest R L. All-or-nothing encryption and the package transform[C]//Fast Software Encryption: 4th International Workshop, FSE’97 Haifa, Israel, January 20–22 1997 Proceedings 4. Springer Berlin Heidelberg, 1997: 210-218.[…

【机器学习合集】激活函数合集 ->(个人学习记录笔记)

文章目录 综述1. S激活函数(sigmoid&Tanh)2. ReLU激活函数3. ReLU激活函数的改进4. 近似ReLU激活函数5. Maxout激活函数6. 自动搜索的激活函数Swish 综述 这些都是神经网络中常用的激活函数,它们在非线性变换方面有不同的特点。以下是这些激活函数的主要区别&am…

3.SpringSecurity基于数据库的认证与授权

文章目录 SpringSecurity基于数据库的认证与授权一、自定义用户信息UserDetails1.1 新建用户信息类UserDetails1.2 UserDetailsService 二、基于数据库的认证2.1 连接数据库2.2 获取用户信息2.2.1 获取用户实体类2.2.2 Mapper2.2.3 Service 2.3 认证2.3.1 实现UserDetails接口2…

「林曦的亲子美育」讲讲关于阅读的那些事儿

「林曦的亲子美育」是“林曦的小世界”2023年策划的一档新栏目。林曦老师作为一个“小男生的妈妈”,在这些年分享了许多关于亲子教育的心得:以“美”作为连接和最高标准,会护持着小朋友的选择和人生。教育是一个生活的过程。做一餐饭、读一本书、看一张画…

vm_flutter

附件地址 https://buuoj.cn/match/matches/195/challenges#vm_flutter 可以在buu下载到。 flutter我也不会,只是这个题目加密算法全部在java层,其实就是一个异或和相加。 反编译 package k;import java.util.Stack;/* loaded from: classes.dex */ pu…

p5.js map映射

本文简介 带尬猴,我嗨德育处主任 p5.js 为开发者提供了很多有用的方法,这些方法实现起来可能不难,但却非常实用,能大大减少我们的开发时间。 本文将通过举例说明的方式来讲解 映射 map() 方法。 什么是映射 从 p5.js 文档 中可…

VSCode:清理ipch缓存

VSCode使用了一段时间,发现有些变慢,电脑管家扫描后,提示“AppData\Local\Microsoft\vscode-cpptools\ipch”目录下有很多缓存文件可以清理。 查询了一下:C/C 扩展常见问题解答 (visualstudio.com) 该件夹内包含缓存的预编译头文…

【算法练习Day30】无重叠区间 划分字母区间合并区间

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 无重叠区间划分字母区间合并…

进击的零跑:拿巨头的钱,把中国车打进欧洲市场

作者 | 张祥威 编辑 | 德新 造车新势力中,零跑属于不惹事,独自在角落低调发育的这一类。偶尔高调门喊一声要干掉特斯拉,围观的人也是笑一笑不当回事儿,于是又回去默默卖车。 声量一般,卖车还行。 行业里每次晒数据&…

redis持久化之RDB(Redis DataBase)

1 : 总体介绍 Redis是一个基于内存的数据库,它的数据是存放在内存中,内存有个问题就是关闭服务或者断电会丢 失。 Redis的数据也支持写到硬盘中,这个过程就叫做持久化 1.1 。 Redis提供了2种不同形式的持久化方式。 RDB(Redis Da…

【Docker】Docker-Compose内置DNS负载均衡失效问题

Docker Compose实现负载均衡 还是对前面的例子docker-compose.yml稍微修改: version: "3.8"services:flask-demo:build:context: .dockerfile: Dockerfileimage: flask-demo:latestenvironment:- REDIS_HOSTredis-server- REDIS_PASS${REDIS_PASS}healt…

回归预测 | MATLAB实现IWOA-LSTM改进鲸鱼算法算法优化长短期记忆神经网络的数据回归预测(多指标,多图)

回归预测 | MATLAB实现IWOA-LSTM改进鲸鱼算法算法优化长短期记忆神经网络的数据回归预测(多指标,多图) 目录 回归预测 | MATLAB实现IWOA-LSTM改进鲸鱼算法算法优化长短期记忆神经网络的数据回归预测(多指标,多图&#…