栈和队列--DS

news2024/12/25 16:14:17

在这里插入图片描述

1. 栈(Stack)

1.1 栈的定义

**栈是一种特殊的线性表,其只允许在固定的一端(栈顶)进行元素插入和删除元素操作。**进行数据插入和删除操作的一段称为栈顶,另一端则称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)原则。
在这里插入图片描述

1.2 栈的核心操作

  1. 压栈(push): 对数据元素进行栈的插入操作叫做压栈/入栈,栈的操作都是针对栈的一端(栈顶)进行的。
public void push(int val) {  
    if(isFull()) {  
        this.elem = Arrays.copyOf(this.elem,elem.length*2);  
    }  
    this.elem[useSize++] = val;  
}  
private boolean isFull() {  
    return useSize == elem.length;  
}

在插入数据元素时,要注意判断栈的空间是否需要扩容,当栈空间满时需要对栈空间进行扩容。
2. 出栈(pop):栈的删除操作叫做出栈,栈的删除操作也是在栈顶执行的。

public int pop() {  
    if(isEmpty()) {  
        throw new EmptyException("栈为空,不能pop");  
    }  
    return this.elem[--useSize];  
}
public boolean isEmpty() {  
    return this.useSize == 0;  
}

当栈为空栈,即栈中没有元素时我们不能对栈进行删除操作,否则抛出异常中止运行,所以在进行栈的删除操作时需要先判定栈中元素是否为空。

1.3 栈的模拟实现

顺序表模拟实现栈

//MyStack.java
package stack;  
  
import java.util.Arrays;  
  
public class MyStack {  
    public int[] elem;  
    public int useSize;  
  
    public MyStack() {  
        this.elem = new int[10];  
    }  
    public void push(int val) {  
        if(isFull()) {  
            this.elem = Arrays.copyOf(this.elem,elem.length*2);  
        }  
        this.elem[useSize++] = val;  
    }  
    private boolean isFull() {  
        return useSize == elem.length;  
    }  
    public int pop() {  
        if(isEmpty()) {  
            throw new EmptyException("栈为空,不能pop");  
        }  
        return this.elem[--useSize];  
    }  
    public int peek() {  
        if(isEmpty()) {  
            throw new EmptyException("栈为空,不能peek");  
        }  
        return this.elem[this.useSize - 1];  
    }  
    public boolean isEmpty() {  
        return this.useSize == 0;  
    }  
    public int size() {  
        return this.useSize;  
    }  
  
}

2. 队列(Queue)

2.1 队列的定义

队列是只允许在一端进行插入操作,在另一端进行数据删除操作的特殊线性表。队列中允许进行插入操作的一端称为队尾(Tail/Rear),进行数据删除操作的一端称为队头(Head/Front).
在这里插入图片描述

2.2 队列的核心操作

  1. 入队列(offer):对于数据的插入操作,我们从队尾入队列。
public void offer(int val) {  
    ListNode newNode = new ListNode(val);  
    if(this.head == null) {  
        this.head = this.tail = newNode;  
        return ;    
    }  
    this.tail.next = newNode;  
    newNode.pre = this.tail;  
    this.tail = this.tail.next;  
}

对于入队列操作,我们这里是利用链表来实现的队列,因此在进行插入操作的时候要特别注意队列为空时的操作。
2. 出队列(poll): 我们从队头进行数据的删除操作。

public int poll() {  
    if(isEmpty()) {  
        throw new EmptyException("队列为空,不能poll");  
    }  
    int val = this.head.val;  
    this.head = this.head.next;  
    if(this.head == null) {  
        this.tail = this.head;  
    }else {  
        this.head.pre = null;  
    }  
    return val;  
}

需要特别注意判别队列是否为空,当队列为空时删除操作是没有意义的。

2.3 队列的模拟实现

链表模拟实现队列

public class MyQueue {  
    static class ListNode {  
        public int val;  
        public ListNode next;  
        public ListNode pre;  
  
        public ListNode(int val) {  
            this.val = val;  
        }  
  
        @Override  
        public String toString() {  
            return "ListNode{" +  
                    "val=" + val +  
                    ", next=" + next +  
                    '}';  
        }  
    }  
    public ListNode head;  
    public ListNode tail;  
    //入队列  
    public void offer(int val) {  
        ListNode newNode = new ListNode(val);  
        if(this.head == null) {  
            this.head = this.tail = newNode;  
            return ;        }  
        this.tail.next = newNode;  
        newNode.pre = this.tail;  
        this.tail = this.tail.next;  
    }  
    //出队列  
    public int poll() {  
        if(isEmpty()) {  
            throw new EmptyException("队列为空,不能poll");  
        }  
        int val = this.head.val;  
        this.head = this.head.next;  
        if(this.head == null) {  
            this.tail = this.head;  
        }else {  
            this.head.pre = null;  
        }  
        return val;  
    }  
    //获取队头元素  
    public int peek() {  
        if(isEmpty()) {  
            throw new EmptyException("队列为空,不能peek");  
        }  
        return this.head.val;  
    }  
    //获取队列中有效元素个数  
    public int size() {  
        ListNode cur = this.head;  
        int len = 0;  
        while(cur != null) {  
            len++;  
            cur = cur.next;  
        }  
        return len;  
    }  
    public boolean isEmpty() {  
        return this.head == null;  
    }  
  
  
}

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

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

相关文章

Android 无Bug版 多语言设计方案!

出海业务为什么要做多语言? 1.市场扩大与本地化需求: 通过支持多种语言,出海项目可以触及更广泛的国际用户群体,进而扩大其市场份额。 本地化是吸引国际用户的重要策略之一,而语言本地化是其中的核心。使用用户的母语…

E37.【C语言】动态内存管理练习题

目录 1. 答案速查 分析 源代码分析 反汇编代码分析(底层) 2. 答案速查 分析 3. 答案速查 分析 VS逐步调试 1. 求下列代码的执行结果 #include <stdio.h> char* GetMemory(void) {char p[] "hello world";return p; }void Test(void) {char* str…

软件测试学习笔记丨allure学习指南

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/32336 安装与下载 需要下载本地文件&#xff0c;并且添加到环境变量里 windows&#xff1a;下载&#xff0c;解压&#xff0c;并配置环境变量 mac&#xff1a;brew install allure 环境变量…

1688代采系统-反向海淘系统详细介绍

Onebound凡邦1688代采系统-反向海淘系统是一种专为海外买家及跨境电商提供一站式采购解决方案的平台。其核心功能和服务旨在解决跨境采购中的语言、货币等常见问题&#xff0c;并优化采购流程&#xff0c;提高采购效率。以下是对该系统的详细介绍。 一、核心功能 商品采集与展…

==与equals比较

在JVM中&#xff0c;内存分为堆内存跟栈内存。他们二者的区别是&#xff1a; 当我们创建一个对象&#xff08;new Object&#xff09;时&#xff0c;就会调用对象的构造函数来开辟空间&#xff0c;将对象数据存储到堆内存中&#xff0c;与此同时在栈内存中生成对应的引用&#…

【AI绘画】如何选择AI绘画工具?Midjourney VS Stable Diffusion?

前言 文章目录 &#x1f4af;如何选择合适的AI绘画工具 个人需求选择比较工具特点社区和资源 &#x1f4af; Midjourney VS Stable Diffusion&#xff1a;深度对比与剖析 使用费用对比使用便捷性与系统兼容性对比开源与闭源对比图片质量对比上手难易对比学习资源对比作品版权…

猎头是这样看简历的?

猎头在看简历时&#xff0c;会遵循一系列高效而系统的步骤&#xff0c;以确保筛选出最适合客户需求的候选人。以下是对猎头如何看简历的详细分析&#xff0c;内容虽无法精确控制在3000字以内&#xff0c;但将尽量精简并涵盖关键信息&#xff1a; 一、初步浏览与筛选 1.基本信…

FLIR AX8 download.php 任意文件读取复现

0x01 产品描述&#xff1a; FLIR-AX8是美国菲力尔公司&#xff08;Teledyne FLIR&#xff09;旗下的一款工业红外热像仪AX8&#xff0c;英文名为Teledyne FLIR AX8 thermal sensor cameras。菲力尔公司专注于设计、开发、生产、营销和推广用于增强态势感知力的专业技术&#xf…

栈与队列面试题(Java数据结构)

前言&#xff1a; 这里举两个典型的例子&#xff0c;实际上该类型的面试题是不确定的&#xff01; 用栈实现队列&#xff1a; 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;双栈 思路 将一个栈当作输入栈&#xff0c;用于压入 push 传入的数…

传统少数民族物品检测系统源码分享

传统少数民族物品检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

【C语言】分支和循环(3)

&#x1f600;个人主页: 起名字真南 &#x1f601;个人专栏 目录 1 for 循环1.1 语法形式1.2 执行流程图1.3 for循环的实践 2 do-while循环2.1 语法形式2.2 执行流程图2.3 do-while循环的实践 3 break 和 continue 语句4 goto语句 1 for 循环 1.1 语法形式 for循环是三种循环…

【Centos】系统安装虚拟系统管理器创建虚拟机

在windows服务器里使用vmware等工具轻松建立虚拟服务器&#xff0c;可以安装各种操作系统。 在Centos系统中默认安装菜单的系统工具中没有找到这个管理器的启动菜单&#xff0c;默认没有安装。 想使用KVM虚拟系统创建虚拟机如何操作呢&#xff1f;最简单就是下面这些命令&…

ViT(Vision Transformer详解)

Transformer作为前沿的深度学习框架&#xff0c;带有多模态的特性&#xff0c;对于不同类型的输入数据&#xff0c;不管是文本还是图像均可进行处理&#xff0c;而ViT则是对于Transformer中的视觉方面&#xff08;也就是输入数据为图像&#xff09;的衍生物&#xff08;因Trans…

从基础到精通:构建并微调大型语言模型以实现分类任务

本章内容 介绍不同的大型语言模型&#xff08;LLM&#xff09;微调方法准备用于文本分类的数据集修改预训练LLM以便进行微调微调LLM以识别垃圾信息评估微调后的LLM分类器的准确性使用微调后的LLM对新数据进行分类 到目前为止&#xff0c;我们已经编写了LLM的架构、对其进行了…

小程序和h5深度分析

你写过小程序/H5&#xff0c;那你知道他们的区别在哪里吗&#xff1f; 为什么说小程序的性能通常优于 H5? 小程序能访问到 DOM 对象吗&#xff1f; 小程序的原理是什么&#xff1f; 小程序和 H5 都是轻量级的、可直接在移动设备上运行的应用&#xff0c;但它们之间存在一些关…

C语言的类型提升机制

概念 在C语言中&#xff0c;整数类型按照其大小可以分为以下几类&#xff08;从小到大&#xff09;&#xff1a; charshortintlonglong long 当在表达式中涉及这些类型的混合运算时&#xff0c;较小的类型会被提升为较大的类型。具体规则如下&#xff1a; ①char 和 short …

【NLP自然语言处理】02 - NLP简介/NLP发展历史/应用场景

1.什么是自然语言处理 (NLP) 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是人工智能的一个重要分支&#xff0c;旨在通过计算机实现对人类自然语言的理解、生成和互动。其核心任务包括分析、生成和转换人类语言&#xff0c;涉及语法、语义、语音识…

Mapsui绘制WKT的示例

步骤 创建.NET Framework4.8的WPF应用在NuGet中安装Mapsui.Wpf 4.1.7添加命名空间和组件 <Window x:Class"TestMapsui.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winf…

基于单片机的烧水壶系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52RC单片机&#xff0c;采用四个按键&#xff0c;通过DS18B20检测温度&#xff0c;开机显示实时温度 第一个按键为切换功能按键&#xff0c;按下后&#xff0c;可以设置烧水温度的大小&…

codetop标签双指针题目大全解析(三),双指针刷穿地心!!!!!

复习比学习更重要&#xff0c;更需要投入时间&#xff0c;更需要花费精力 1.字符串的排列2.找出字符串中第一个匹配的下标3.最大连续1的个数II4.数组中的山脉5.移除元素6.两个数组的交集II7.有序数组的平方8.删除有序数组中的重复项II9.寻找重复数10.水果成篮 1.字符串的排列 …