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

文章目录

  • 栈(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_CAPACITY
    public 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;
    }
}

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

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

相关文章

私有云:【12】使用connention托管虚拟桌面

私有云:【12】使用connention托管虚拟桌面 1、使用connention托管虚拟桌面 1、使用connention托管虚拟桌面 使用cloudadmin用户登录connection服务器 登录connection客户端 创建桌面池 选择手动桌面池 选择vcenter虚拟机 选择vcenter.test.com 按如下选择下一步 设…

uniapp 在 Android Studio 模拟器中运行项目

在开发App时,无论是使用 Flutter 还是 React native,还是使用uni-app 开发跨端App时,总是需要运行调试。一般调试分为两种。 第一:真机调试 第二:模拟器调试 真机调试的好处是可以看到更好的效果,缺点就是…

JavaScript对象与原型

目录 对象的创建 原型与原型链 原型继承 总结 在JavaScript中,对象是非常重要的概念之一。它们允许我们以一种结构化的方式存储和组织数据,并提供了一种方便的方式来操作和访问这些数据。而对象的行为和属性则通过原型来定义。 对象的创建 在JavaS…

【Leetcode】【每日一题】【中等】274. H 指数

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/h-index/description/?envTyped…

蚁群算法求包含34个国内城市的TSP,和最优解相差没那么大

文章目录 引言蚁群觅食算法原理代码实现ACO求解TSP整数规划求解TSP 相关阅读 引言 上一篇介绍的差分进化算法,很适合求解连续变量的优化问题;但针对组合优化问题,就不是很适用了。 至于哪一种智能优化算法更适合求解组合优化问题&#xff0…

vim使用

概述 vi(visual editor)是Unix/Linux编辑器的一种。类似于win中notepad。vim(vi improved)加强版 安装vim: $ yum install vim -y四种模式 命令模式:快速进行复制、粘贴、删除等操作,还可以…

【深度学习】Transformer、GPT、BERT、Seq2Seq什么区别?

请看vcr:https://transformers.run/back/transformer/

项目管理49个过程定义与作用、五大过程组

五大过程组: 49个过程的定义与作用: 1.整合管理: (1)制定项目章程:制定项目章程是编写一份正式批准项目并授予项目经理权力的文件的过程,其作用是①确立组织与项目的关系;②展示组织对项目的承诺&#xff…

超全整理,服务端性能测试-docker部署tomcat/redis(详细步骤)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、docker部署tom…

大彩串口屏读写文件问题

分区 本文使用的是大彩串口屏M系列的: 串口屏内部有三个分区,分别为A、B、C三个区: A区:系统区,存储组态工程文件 B区:数据区,存储配置信息,记录数据、历史曲线等 C区:备…

并发编程

什么是并发编程? 并行:在同一个时间节点上,多个线程同时执行(是真正意义上的同时执行) 并发:一个时间段内,多个线程依次执行。 并发编程:在例如买票、抢购、秒杀等等场景下,有大量的请求访问…

git 推送到github远程仓库细节处理(全网最良心)

我查看了很多网上的教程都不是很好 我们先在github创建一个仓库,且初始化 readme 我们到本地文件初始化仓库 添加远程仓库 这时候我们就 git add . , git commit ,再准备git push 的时候 显示没有指定远程的分支 我们按照提示操作 提示我们要先git pull 提示我…

激活函数作用以及 sigmoid和softmax

激活函数 激活函数在神经网络中起着非常重要的作用,它的主要功能是引入非线性性质,使得神经网络可以学习和表示更加复杂的模式和关系。下面是激活函数的几个主要作用: 引入非线性:激活函数通过引入非线性变换,打破了…

Kubernetes - Ingress HTTP 负载搭建部署解决方案(新版本v1.21+)

在看这一篇之前,如果不了解 Ingress 在 K8s 当中的职责,建议看之前的一篇针对旧版本 Ingress 的部署搭建,在开头会提到它的一些简介Kubernetes - Ingress HTTP 负载搭建部署解决方案_放羊的牧码的博客-CSDN博客 开始表演 1、kubeasz 一键安装…

M1安装OpenPLC Editor

下载OpenPLC Editor for macOS.zip文件后,使用tar -zvxf命令解压,然后将"OpenPLC Editor"拖入到"应用程序"文件夹 右键点击"OpenPLC Editor",打开这个""文件,替换为以下内容 #!/bin/bash…

C++设计模式_15_Proxy 代理模式

Proxy 代理模式也是属于“接口隔离”模式,通过增加一层间接层来解决问题的模式。 文章目录 1. 动机( Motivation)2. 模式定义3. 结构( Structure )4. 代码演示Proxy 代理模式4.1 常规方法4.2 Proxy 代理模式 5. 要点总结6. 其他参考 1. 动机( Motivation) 在面向对…

How to install the console system of i-search rpa on Centos 7

How to install the console system of i-search rpa on Centos 7 1、 准备1.1 、查看磁盘分区状态1.2、上传文件1.2.1、添加上传目录1.2.2、上传安装包1.2.3、解压安装包1.2.4、查看安装包结构 1.3、安装依赖包1.3.1、基础依赖包1.3.2 相关依赖 1.4、关闭防火墙1.5、解除SeLin…

MyBaties存储和查询json格式的数据(实体存储查询版本)

最近在做的功能,由于别的数据库有值,需要这边的不同入口的进来查询,所以需要同步过来,如果再继续一个一个生成列对应处理感觉不方便,如果没有别的操作,只是存储和查询,那就可以用MySql支持的jso…

2022年上半年上午易错题(软件设计师考试)

1.以下关于冯诺依曼计算机的叙述中,不正确的是( )。 A.程序指令和数据都采用二进制表示 B.程序指令总是存储在主存中,而数据则存储在高速缓存中 C.程序的功能都由中央处理器(CPU)执行指令来实现 D.程序的执行过程由指令进行自动控制 程序指令和数据…

【Android】MQTT入门——服务器部署与客户端搭建

目录 MQTT 协议简介应用场景优点缺点 部署服务端下载安装包启动服务器 搭建客户端下载SDK添加依赖配置MQTT服务和权限建立连接订阅主题发布消息取消订阅断开连接 MQTT客户端工具最终效果实现传感器数据采集与监测功能思路 MQTT 协议 简介 MQTT(Message Queuing Te…