(泛型+栈+队列+可变不可变)的实现(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.mfbz.cn/a/579157.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode使用EditorConfig进行项目配置

安装 EditorConfig for VS Code 插件&#xff0c;该插件会自动读取项目的 .editorconfig 文件&#xff0c;对项目进行配置。 该文件支持属性&#xff1a; indent_style&#xff1a;缩进风格&#xff0c;可配置项&#xff1a;tab&#xff0c;spaceindent_size&#xff1a;缩进…

前端学习<四>JavaScript——54-原型链

常见概念 构造函数 构造函数-扩展 原型规则和示例 原型链 instanceof 构造函数 任何一个函数都可以被 new&#xff0c;new 了之后&#xff0c;就成了构造方法。 如下&#xff1a; function Foo(name, age) {this.name name;this.age age;//retrun this; //默认有这…

数据聚类:Mean-Shift和EM算法

目录 1. 高斯混合分布2. Mean-Shift算法3. EM算法4. 数据聚类5. 源码地址 1. 高斯混合分布 在高斯混合分布中&#xff0c;我们假设数据是由多个高斯分布组合而成的。每个高斯分布被称为一个“成分”&#xff08;component&#xff09;&#xff0c;这些成分通过加权和的方式来构…

ElasticSearch教程入门到精通——第二部分(基于ELK技术栈elasticsearch 7.x+8.x新特性)

ElasticSearch教程入门到精通——第二部分&#xff08;基于ELK技术栈elasticsearch 7.x8.x新特性&#xff09; 1. JavaAPI-环境准备1.1 新建Maven工程——添加依赖1.2 HelloElasticsearch 2. 索引2.1 索引——创建2.2 索引——查询2.3 索引——删除 3. 文档3.1 文档——重构3.2…

GPU:使用gpu-burn压测GPU

简介&#xff1a;在测试GPU的性能问题时&#xff0c;通常需要考虑电力和散热问题。使用压力测试工具&#xff0c;可以测试GPU满载时的状态参数&#xff08;如温度等&#xff09;。gpu_burn是一个有效的压力测试工具。通过以下步骤可以进行测试。 官网&#xff1a; http://www…

Linux——终端

一、终端 1、终端是什么 终端最初是指终端设备&#xff08;Terminal&#xff09;&#xff0c;它是一种用户与计算机系统进行交互的硬件设备。在早期的计算机系统中&#xff0c;终端通常是一台带有键盘和显示器的电脑&#xff0c;用户通过它输入命令&#xff0c;计算机在执行命…

PMBOK® 第六版 项目是什么

目录 读后感—PMBOK第六版 目录 项目定义 定义&#xff1a;项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目的特征具备以下三点&#xff1a; 独特性&#xff1a;独一无二&#xff0c;无法简单重复过去的做法。 临时性&#xff1a;项目有明确的起点和终点&…

(22408)武汉大学计算机专硕初试备考经验贴

首先谈一下&#xff0c;写这篇文章的初衷。 我相信考武大计算机的同学都是优秀的&#xff0c;应该有自己的备考方法&#xff0c;所以这里并不介绍具体怎么备考某一科目。 计算机考研热度较高&#xff0c;备考不易&#xff0c;这里将自己备考过程中遇到的问题&#xff0c;分享…

人工智能|推荐系统——推荐大模型最新进展

近年来,大语言模型的兴起为推荐系统的发展带来了新的机遇。这些模型以其强大的自然语言处理能力和丰富的知识表示,为理解和生成复杂的用户-物品交互提供了新的视角。本篇文章介绍了当前利用大型语言模型进行推荐系统研究的几个关键方向,包括嵌入空间的解释性、个性化推荐的知…

中国人工智能奠基人张钹院士:走进“无人区” 探索人工智能之路

4月23日&#xff0c;中国人工智能奠基人、清华大学计算机系教授、中国科学院院士张钹在“人文清华”讲坛作专题分享。在2小时的直播中&#xff0c;张钹以《走进“无人区” 探索人工智能之路》为主题&#xff0c;回顾人工智能的发展历程&#xff0c;为大家解读ChatGPT的意义&…

新手Pytorch入门笔记-概念入门

文章目录 1.主干权重和模型权重2.超参数2.1 ReLU(inplaceTrue)2.2 交叉熵损失CrossEntropyLoss 3.反向传播4.优化器4.1 optimizer.zero_grad()5.卷积6.Batch Normalization7.U-Net结构 这章节比较枯燥&#xff0c;都是大段文字 1.主干权重和模型权重 主干权重&#xff08;Back…

GateWay具体的使用之全链路跟踪TraceId日志

1.创建全局过滤器&#xff0c;在请求头上带入traceId参数&#xff0c;穿透到下游服务. package com.by.filter;import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.jwt.JWTValidator;…

vue做导入导出excel文档

系统中经常会遇到要实现批量导入/导出数据的功能&#xff0c;导入就需要先下载一个模板&#xff0c;然后在模板文件中填写内容&#xff0c;最后导入模板&#xff0c;导出就可能是下载一个excel文件。 1、导出 新建一个export.js文件如下&#xff1a; import {MessageBox,Mes…

【Git】分支管理的基本操作

文章目录 理解分支分支的本质主分支创建分支切换分支合并分支fast-forward模式删除分支合并冲突问题 理解分支 分支管理是git的一个核心功能。在git中&#xff0c;分支是用来独立开发于某个功能或者修复某个bug的一种方式。就像是《火影忍者》中的鸣人使用分身去妙蛙山修炼&am…

ansible-copy用法

目录 概述实践不带目录拷贝带目录拷贝 概述 ansible copy 常用用法举例 不带目录拷贝&#xff0c;拷贝的地址要写全 带目录拷贝&#xff0c;拷贝路径不要写在 dest 路径中 实践 不带目录拷贝 # with_fileglob 是 Ansible 中的一个循环关键字&#xff0c;用于处理文件通配符匹…

【强训笔记】day4

NO.1 思路&#xff1a;利用滚动数组&#xff0c;迭代一个Fibonacci数列&#xff0c;给出三个值进行循环迭代&#xff0c;当n<c时&#xff0c;说明n在b和c之间&#xff0c;这里只需要返回c-n和n-b的最小值就可以了。 代码实现&#xff1a; #include<iostream>using n…

BLIP-2论文精读

概述 由于大规模模型的端到端训练&#xff0c;视觉和语言预训练的成本越来越高&#xff0c;BLIP-2是一种通用且高效的预训练策略&#xff0c;可以从现成的冻结的预训练图像编码器和冻结的大型语言模型引导视觉语言预训练。 模型主体框架 BLIP-2采用了一个轻量级的查询转换器Q…

【Docker】Docker的网络与资源控制

Docker网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。因为在同一宿主机内…

什么是外汇杠杆交易?

外汇杠杆交易是目前的外汇交易市场中&#xff0c;投资者进行外汇交易的重要方式&#xff0c;通过这样的交易方式&#xff0c;投资者就有机会进行以小搏大的交易&#xff0c;他们的交易就有可能会更成功&#xff0c;因此&#xff0c;投资者应该对这样的交易方式进行了解&#xf…

【车展直播(1)】电机的知识

背景&#xff0c;最近在2024 北京车展&#xff0c;然后需要做一些直播讲解。 首先需要关注的是电动车的电机。其实这个东西吧&#xff0c;我不能算是完全知道&#xff0c;但是自己做做PWM 控制器&#xff0c;MOS管驱动&#xff0c;做两轮电机Motor 的控制这种基础的工作还是有…