(泛型+栈+队列+可变不可变)的实现(java版)

文章目录

  • 1. 介绍
  • 2. 代码实现
    • 2.1 普通的栈
    • 2.2 普通的循环队列
    • 2.3 泛型栈
    • 2.4 泛型循环队列
    • 2.5 泛型可变栈
    • 2.6 泛型可变队列
    • 2.7 部分测试
  • 3. 参考链接

如果你之前没有了解过栈或者队列,可以看看本文最后的链接,里面很详细

1. 介绍

  • 泛型,泛指一切类型。
  • 栈(Stack):是只允许在一端进行插入或删除的线性表。首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
  • 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。

2. 代码实现

2.1 普通的栈

class StackX{private int[] arr;private int index = 0;public StackX(int size){this.arr = new int[size];}// 判断是否为空public boolean isEmpty(){if(index == 0)return true;return false;}// 判断是否满了public boolean isFull(){if(arr != null && index == arr.length)return true;return false;}// 入栈public void push(int x){if(!isFull()){arr[index++] = x;}}// 出栈public int pop(){if(!isEmpty()){return arr[--index];}System.out.println("空");return 0;}// 获取栈顶元素public int getTop(){if(!isEmpty())return arr[index - 1];System.out.println("空的");return 0;}
}

2.2 普通的循环队列

class Queue{private int front = 0;private int last = 0;private int[] arr;public Queue(int size){arr = new int[size];}// 判空public boolean isEmpty(){if(front == last)return true;return false;}// 判满public boolean isFull(){if((last + 1) % arr.length == front)return true;return false;}// 入队public void add(int x){if(!isFull()){arr[front % arr.length] = x;front ++ ;}}// 出队public int pop(){if(!isEmpty()){last++;return arr[(last - 1) % arr.length];}System.out.println("空队列");return 0;}
}

2.3 泛型栈

class StackY<E>{private E[] arr;private int index = 0;public StackY(int size){this.arr = (E[])new Object[size];}// 判断是否为空public boolean isEmpty(){if(index == 0)return true;return false;}// 判断是否满了public boolean isFull(){if(arr != null && index == arr.length)return true;return false;}// 入栈public void push(E x){if(!isFull()){arr[index++] = x;return;}System.out.println("满了!!");}// 出栈public E pop(){if(!isEmpty()){return arr[--index];}System.out.println("空");return null;}// 获取栈顶元素public E getTop(){if(!isEmpty())return arr[index - 1];System.out.println("空的");return null;}
}

2.4 泛型循环队列

class QueueY<E>{private int front = 3;private int last = 3;private E[] arr;public QueueY(int size){// 牺牲一个空间进行判断arr = (E[])new Object[size + 1];}// 判空public boolean isEmpty(){if(front == last)return true;return false;}// 判满public boolean isFull(){if((front + 1) % arr.length == last){System.out.println("满了");return true;}return false;}// 入队public void add(E x){if(!isFull()){arr[front % arr.length] = x;front ++ ;}}// 出队public E pop(){if(!isEmpty()){last++;return arr[(last - 1) % arr.length];}return null;}
}

2.5 泛型可变栈

其实是每当出现栈满的时候,会进行增加一倍的操作

public class Stack2X<E> {private E[] arr = (E[]) new Object[10];private int flag = 0;public void add(E x){if(flag == arr.length){E[] arrnew = (E[]) new Object[arr.length * 2];for(int i = 0; i < arr.length; i++){arrnew[i] = arr[i];}arr = arrnew;}arr[flag] = x;flag++;}public E get(){if(flag == 0){return null;}else{E x = arr[flag - 1];flag--;return x;}}
}

2.6 泛型可变队列

每当队列满了以后进行扩展,利用(余数+原队列长度)进行扩展

public class Queue2<E> {private E[] arr = (E[]) new Object[4]; private int add = 0;private int get = 0;public void add(E x) {if(add - get == arr.length) {E[] arrnew = (E[]) new Object[arr.length * 2];for(int i = get; i < add; i++) {arrnew[i % arrnew.length] = arr[i % arr.length];}arr = arrnew;}arr[add % arr.length] = x;add++;}public E get() {if(add == get) {return null;}else {E x = arr[get % arr.length];get++;return x;}}
}

2.7 部分测试


public class Test {public static void main(String[] args) {QueueY<String> demo = new QueueY<>(10);for(int i =  0; i < 11; i++){demo.add(i + "");}for(int i = 0; i <11; i++){String out = demo.pop();if(out == null){System.out.println("空的");}else{System.out.println(out);}}}
}

运行结果:

满了
0
1
2
3
4
5
6
7
8
9
空的

3. 参考链接

Java泛型详解(史上最全泛型知识详解)
数据结构:栈和队列(Stack & Queue)【详解】

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

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

相关文章

unity cinemachine相机 (案例 跟随角色移动)

安装相机包 打开包管理工具 在 unity registry 搜索cinemachine 会在maincamera中生成一个组件cinemachineBrain 只能通过虚拟相机操控 主相机 虚拟相机的参数 案例 1.固定相机效果 位置 在固定的地方 默认的模式 2.相机跟随人物效果 焦距设置 20 跟随设置 把playere…

Django框架之python后端框架介绍

一、网络框架及MVC、MTV模型 1、网络框架 网络框架&#xff08;Web framework&#xff09;是一种软件框架&#xff0c;用于帮助开发人员构建Web应用程序和Web服务。它提供了一系列预先编写好的代码和工具&#xff0c;以简化开发过程并提高开发效率。网络框架通常包括以下功能…

Web前端框架/库/工具

前言 俗话说&#xff1a;前端从步枪&#xff08;原生js&#xff09;到了半自动武器&#xff08;jQuery&#xff09;并进化为全自动武器&#xff08;三大框架&#xff08;angular&#xff0c;react&#xff0c;vue及其生态链&#xff09;&#xff09;。 常说工欲善其事必先利其…

python作业 切片逆转

题目&#xff1a; &#xff08;反转显示一个整数&#xff09;编写下面的函数&#xff0c;反向显示一个整数。 列如&#xff1a;reserse(3456)。编写一个测试程序&#xff0c;提示用户输入一个整数&#xff0c;然后显示它的反向数。 第一步定义一个函数&#xff1a; def rev…

AUTOSAR-SD篇

1 概述 服务发现模块的主要任务是管理在车内通信中被称为服务的功能实体的可用性&#xff0c;以及控制事件消息的发送行为。只允许向需要这些事件消息的接收器发送事件消息&#xff08;发布/订阅&#xff09;。 这里描述的解决方案也被称为SOME/IP-SD&#xff08;基于IP -服务发…

前端css中keyframes(关键帧)的简单使用

前端css中keyframes的使用 一、前言二、例子&#xff08;一&#xff09;、例子源码1&#xff08;二&#xff09;、源码1运行效果1.视频效果2.截图效果 三、结语四、定位日期 一、前言 关键帧keyframes是css动画的一种&#xff0c;主要用于定义动画过程中某一阶段的样式变化&am…

【STM32+HAL】读取电池电量

一、准备工作 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 有关定时器触发ADC模式配置&#xff0c;详见【STM32HAL】ADC采集波形实现 有关软件触发ADC模式配置&#xff0c;详见【STM32HAL】三轴按键PS2摇杆 二、所用工具…

Bytebase 2.16.0 - 支持 Oracle 和 SQL Server DML 变更的事前备份

&#x1f680; 新功能 支持 Oracle 和 SQL Server DML 变更的事前备份。 支持在 SQL 编辑器中显示存储过程和函数。 支持兼容 TDSQL 的 MySQL 和 PostgreSQL 版本。 支持把数据库密码存储在 AWS Secrets Manager 和 GCP Secret Manager。 支持通过 IAM 连接到 Google Clou…

VirtualBox7.0.16的蓝屏大坑与ssh登陆ubuntu虚拟机的办法

背景&#xff1a; 安装了最新版的VirtualBox&#xff0c;装了ubuntu系统&#xff0c;在win10下通过ssh死活无法与ubuntu进行正常登陆控制。 然后开始了踩坑。 问题1&#xff1a;ssh登陆失败&#xff0c;但是主机能ping通ubuntu&#xff0c;反过来也能ping通&#xff0c;网络…

线性代数基础1向量

1、向量是什么 1.1、向量的定义 在数学中&#xff0c;向量&#xff08;也称为欧几里得向量、几何向量、矢量&#xff09;&#xff0c;指具有大小和方向的量。它可以形象化地表示为带箭头的线段。箭头所指&#xff1a;代表向量的方向&#xff1b;线段长度&#xff1a;代表向量的…

增加PyQt5界面的交通流量预测(模型为CNN_GRU,CNN_BiGRU_ATTENTION,LSTM,Python代码)

1.效果视频&#xff1a;增加PyQt5界面的交通流量预测&#xff08;模型为CNN_GRU&#xff0c;CNN_BiGRU_ATTENTION&#xff0c;LSTM&#xff09;_哔哩哔哩_bilibili&#xff09; 2.三个模型和数据集的介绍 交通流量预测(python代码&#xff0c;压缩包中带有数据&#xff0c;CN…

NAT的知识点和实现

1.NAT的作用&#xff1a; &#xff08;1&#xff09;、把内网私网IP转换公网IP&#xff1b; &#xff08;2&#xff09;、隐藏内网&#xff0c;起到保护内网作用&#xff1b; &#xff08;3&#xff09;、适当的缓解的IPv4地址空间枯竭&#xff1b; &#xff08;4&#xff…

自己搭建的大疆无人机RTMP流媒体服务延迟太大

流程&#xff1a;无人机摄像头->图传->遥控器->流媒体服务器->取流播放&#xff0c;延迟有10秒来的&#xff0c;大家有没有什么好的方案。

【6】mysql查询性能优化-关联子查询

【README】 0. 先说结论&#xff1a;一般用inner join来改写in和exist&#xff0c;用left join来改写not in&#xff0c;not exist&#xff1b;&#xff08;本文会比较内连接&#xff0c;包含in子句的子查询&#xff0c;exist的性能 &#xff09; 1. 本文总结自高性能mysql 6…

【前端开发基础知识快速入门】

前端开发基础知识&快速入门 一、VSCode 使用1.1 安装常用插件1.2 创建项目1.3 创建网页1.4 运行效果二、ES62.1 简介2.2 什么是 ECMAScript2.3 ES6 新特性2.3.1 let 声明变量2.3.2 const 声明常量(只读变量)2.3.3 解构表达式2.3.4 字符串扩展2.3.5 函数优化2.3.6 对象优化…

使用Android studio,安卓手机编译安装yolov8部署ncnn,频繁出现编译错误

从编译开始就开始出现错误&#xff0c;解决步骤&#xff1a; 1.降低graddle版本&#xff0c;7.2-bin --->>> 降低为 6.1.1-all #distributionUrlhttps\://services.gradle.org/distributions/gradle-7.2-bin.zip distributionUrlhttps\://services.gradle.org/di…

【04】JAVASE-循环语句【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

解决双击PDF文件出现打印的问题【Adobe DC】

问题描述 电脑安装Adobe Acrobat DC之后&#xff0c;双击PDF文件就会出现打印&#xff0c;而无法直接打开。 右键PDF文件就会发现&#xff0c;第一栏出现的不是用Adobe打开&#xff0c;而是打印。 重装软件多次仍然无法解决。 原因 右键菜单被改写了。双击其实是执行右键菜…

条件编译 #和##运算符

目录 1. #运算符2. ##运算符3. 条件编译4. 题目分享总结 正文开始 前言: 本章为C语言语法完结撒花, 下文将进行C语言中#和##操作符以及条件编译的讲解, 来进一步让我们了解C语言. 作者主页: 酷酷学!!! 1. #运算符 #运算符将宏的⼀个参数转换为字符串字⾯量。它仅允许出现在带…

解锁ApplicationContext vs BeanFactory: 谁更具选择性?

目录 一、聚焦源码回顾 &#xff08;一&#xff09;源码分析和理解 &#xff08;二&#xff09;简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 &#xff08;一&#xff09;主要特性总结 &#xff08;二&#xff09;直接建议 三、案例简单说明 &am…