(泛型+栈+队列+可变不可变)的实现(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.mzph.cn/diannao/4380.shtml

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

相关文章

ssm项目后端如何导出war及前端如何导出静态资源

后端如何导出war包 后端工具&#xff1a;IDEA 2020.1.3 运行我们编写工具maven里面的package 运行成功的日志 我们运行完&#xff0c;会生成一个target文件夹&#xff0c;在这个文件夹里面找到war包即可 前端如何导出静态资源 使用工具&#xff1a;WebStorm 2020.1.3 打开左…

VUE3核心语法

&#x1f49f;&#x1f49f;前言 ​ 友友们大家好&#xff0c;我是你们的小王同学&#x1f617;&#x1f617; 今天给大家打来的是 VUE3核心语法 希望能给大家带来有用的知识 觉得小王写的不错的话麻烦动动小手 点赞&#x1f44d; 收藏⭐ 评论&#x1f4c4; 小王的主页&#xf…

数据结构习题--旋转链表

数据结构习题–旋转链表 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。注意这里的k可能超过链表的长度 方法&#xff1a;双指针 分析 旋转K次&#xff0c;我们其实就是相当于找到倒数第K个结点&#xff0c;让其成为头结点…

基于Springboot的考研资讯平台

基于SpringbootVue的考研资讯平台的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 考研资讯 报考指南 资料信息 论坛信息 后台登录 考研资讯管理 学生管理 资…

Python重点数据结构基本用法

Python重点数据结构用法 运算符描述[] [:]下标&#xff0c;切片**指数~ -按位取反, 正负号* / % //乘&#xff0c;除&#xff0c;模&#xff0c;整除 -加&#xff0c;减>> <<右移&#xff0c;左移&按位与^ < < > >小于等于&#xff0c;小于&#…

微信公众号菜单管理接口开发

1、创建数据表 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for wx_menu -- ---------------------------- DROP TABLE IF EXISTS `wx_menu`; CREATE TABLE `wx_menu` (`id` bigint(20) NOT NULL AUTO_INCREMENT COM…

学pyhton的第二十二天

原文链接&#xff1a;Python 图形化界面设计&#xff08;Tkinter&#xff09; - 简书 (jianshu.com) 相关博客链接 接第十八天Tkinter的内容&#xff1a; 单选按钮&#xff08;控件&#xff1a;Radiobutton&#xff09;&#xff1a; 除共有属性外&#xff0c;还具有显示文本…

数据结构 : 树的分类及在数据库索引中的运用

文章目录 一 &#xff1a;树的分类1、二叉树&#xff08;Binary Tree&#xff09;&#xff1a;2、二叉搜索树&#xff08;Binary Search Tree, BST&#xff09;&#xff1a;3、平衡二叉树&#xff1a;4、字典树&#xff08;Trie&#xff09;&#xff1a;5、多叉树&#xff08;M…

算法学习笔记Day9——动态规划基础篇

一、介绍 本文解决几个问题&#xff1a;动态规划是什么&#xff1f;解决动态规划问题有什么技巧&#xff1f;如何学习动态规划&#xff1f; 1. 动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法&#xff0c;只不过在计算机问题上应用比较多&#xff…

opencv_17_翻转与旋转

一、图像翻转 1&#xff09;void flip_test(Mat& image); 2&#xff09;void ColorInvert::flip_test(Mat& image) { Mat dst; //flip(image, dst, 0); //上下翻转 flip(image, dst, 1); //左右翻转 // flip(image, dst, -1); //180度翻转 imsho…

OpenVINO安装教程 vcpkg版

通过 vcpkg 安装 OpenVINO™ Runtime 请注意&#xff0c;vcpkg 发行版&#xff1a; 仅提供 C/C API 不支持 NPU 推理 专用于所有主要操作系统的用户&#xff1a;Windows、Linux 和 macOS &#xff08;所有 x86_64 / ARM64 架构&#xff09; 系统要求处理器说明软件要求 完整…

B站美化插件,支持自定义,太酷辣~

大公司的软件和网站通常具有优雅的默认界面设计。 以国内二次元聚集地B站为例&#xff0c;可以说它的UI设计非常吸引人。与其他视频网站繁复的设计相比&#xff0c;B站的界面设计可以说是遥遥领先 然而&#xff0c;总有些人对默认的用户界面感到不满意&#xff0c;他们渴望尝试…

接口自动化测试框架

接口自动化测试框架&#xff1a;pythonunittest/pytestrequestsddtopenpyxlpymysqllogging 框架设计思路数据驱动结构分层&#xff08;可读性、可维护性、可扩展性&#xff09;数据驱动将维护数据与代码分离&#xff0c;接口调用行为一致&#xff0c;针对不同的参数组合驱动不同…

fiddler提示“The system proxy was changed.Click to reenable capturing.”的原因及解决办法

一、现象描述 运行fiddler时&#xff0c;提示“The system proxy was changed.Click to reenable capturing.”&#xff0c;即使点击了该提示&#xff0c;重新进行抓包&#xff0c;不一会儿&#xff0c;该提示又会出现&#xff0c;又不能进行抓包了。 二、解决方法 2.1 原因一&…

Java 高级面试问题及答案

Java 高级面试问题及答案 问题 1: 在 Java 中&#xff0c;什么是强引用、软引用、弱引用和虚引用&#xff1f;它们分别有什么用途&#xff1f; 探讨过程&#xff1a; 在Java中&#xff0c;对象的引用类型决定了垃圾回收器如何回收对象。强引用是最常见的&#xff0c;它阻止垃…

java 根据对象的boolean字段对集合进行排序

java 根据对象的boolean字段对集合进行排序 ‍ 需求大概如下&#xff1a; 把boolean为true的排序到前面,false排序到后面 ‍ 排序后, boolean为true的会在前面, 为false的会在后面 , isHasMaterial 为boolean类型 Data Builder public class MoguPoiBaseInfo {/*** 是否有…

输电线路的“天眼”:双目协同图像视频监测装置

在广袤的天地之间&#xff0c;纵横交错的输电线路如同血脉一般&#xff0c;为我们的生活输送着源源不断的电力。然而&#xff0c;这些“血脉”也常常面临着各种挑战&#xff0c;如外力破坏、恶劣天气等。为了守护这些重要的“生命线”&#xff0c;鼎信智慧研发了一款智能监控设…

LeetCode 1146. 快照数组【哈希表+二分查找】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

云原生Kubernetes: K8S 1.29版本 部署GitLab

目录 一、实验 1.环境 2.搭建NFS 3.K8S 1.29版本 部署Redis 4.K8S 1.29版本 部署Postgresql 5.K8S 1.29版本 部署GitLab 6.K8S 部署istio微服务 7.K8S 部署ingress应用路由 二、问题 1.K8S部署gitlab报错 2.gitlab创建失败 3.生成网关资源报错 4.安装istio 报错 …

APP自定义身份证相机(Android +iOS)

基本上同时兼容安卓和苹果的插件都需要付费&#xff0c;这里我找了2个好用的免费插件 1.仅支持安卓&#xff1a;自定义身份证相机&#xff08;支持蒙版自定义&#xff09;&#xff0c;内置蒙版&#xff0c;照片预览&#xff0c;身份证裁剪 - DCloud 插件市场、 2.支持iOS(已测…