栈和队列详解

news2024/11/17 6:28:07

目录

一,栈的概念及其结构

 二,栈的方法及其实现

2.1 栈

2.2 push(int val) - 进栈

2.3 pop() - 出栈

2.4 peek() - 得到栈顶元素

2.5 size() - 栈的大小

2.6 empty()

2.7 isFull()

三,队列的概念及其结构

 四,队列的方法及其实现

4.1队列

4.2 offer(int val) - 入队列

4.3 poll() - 出队列

4.4 peek() - 获得队头元素


一,栈的概念及其结构

栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出的原则。画个图来理解一下:

 二,栈的方法及其实现

2.1 栈

栈的定义及其拥有的方法,(了解过的同学可以尝试写一写再看):

class MyStack{
    int[] elem;//使用数组来模拟栈
    int usedSize;//栈中有多少元素
    private static final int INIT = 10;//默认初始化10个
    public MyStack(){
        elem = new int[INIT];
    }

    //进栈
    public int push(int val){}

    //出栈
    public int pop(){}

    //得到栈顶元素,但不要出栈
    public int peek(){}

    //栈有多少元素-栈的大小
    public int size(){}

    //栈是否为空
    public boolean empty(){}

    //栈是否满了
    public boolean isFull(){}
}

2.2 push(int val) - 进栈

    public int push(int val){
        if(isFull()){
            elem = Arrays.copyOf(elem, elem.length*2);//扩容
        }
        elem[usedSize] = val;
        usedSize++;
        return elem[usedSize];
    }

2.3 pop() - 出栈

    public int pop(){
        if(empty()){
            System.out.println("栈中没有元素!");
            return -1;
        }
        usedSize--;
        return elem[usedSize];
    }

2.4 peek() - 得到栈顶元素

    public int peek(){
        if(empty()){
            System.out.println("栈中没有元素!");
            return -1;
        }
        return elem[usedSize-1];
    }

2.5 size() - 栈的大小

    public int size(){
        return usedSize;
    }

2.6 empty()

    public boolean empty(){
        return 0 == usedSize;
    }

2.7 isFull()

    public boolean isFull(){
        return elem.length == usedSize;
    }

三,队列的概念及其结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的原则。 入队列:进行插入操作的一端称为队尾。 出队列:进行删除操作的一端称为队头。画个图来了解一下:

 四,队列的方法及其实现

4.1队列

队列的初始化及其主要方法,使用双向链表实现,不了解双向链表的可以看看我之前写的文章:

public class MyQueue {
    public static class ListNode{
        ListNode next;
        ListNode prev;
        int val;
        ListNode(int val){
            this.val = val;
        }
    }
    ListNode first;//队头
    ListNode last;//队尾
    int usedSize = 0;//队列的大小

    //入队列
    public void offer(int val){}

    //出队列
    public int poll(){}

    //获得队头元素
    public int peek(){}
}

4.2 offer(int val) - 入队列

    public void offer(int val){
        ListNode node = new ListNode(val);
        if(first == null){//队列中没有元素
            first = node;
        }else{
            last.next = node;
            node.prev = last;
        }
        last = node;//更换队尾
        usedSize++;
    }

4.3 poll() - 出队列

    public int poll(){
        int value = -1;
        if(first == null){
            System.out.println("队列为空!");
            return value;
        }else if(first == last){//只有一个元素
            value = first.val;
            first = null;
            last = null;
        }else{
            value = first.val;//存储队头元素
            first = first.next;
            first.prev.next = null;
            first.prev = null;
        }
        return value;
    }

4.4 peek() - 获得队头元素

    public int peek(){
        if(first == null){
            System.out.println("队列为空!");
            return -1;
        }
        return first.val;
    }

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

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

相关文章

面试题之MySQL事物的特性和锁

在关系性数据库管理系统配置,一个逻辑工作要成为事物,必须要满足4个特性,即所谓的ACID:原子性(Atomicity),一致性(Consistency)、隔离性(lsolation)和持久性(Durability)。 原子性: 原子性:事物作为一个整体被执行,包含在其中对…

Maven安装步骤

Maven官网下载安装包: https://maven.apache.org/download.cgi Maven下载官网 解压安装包 在环境变量中配置 MAVEN_HOME 和 Path 打开cmd,输入mvn -v查看安装成功

用Inno Setup6.2.1对Pyinstaller打包的python可执行文件exe做代码签名,签名工具用微软件SignTool

说明:使用本博文的前提条件是,你已经将代码打包成可执行文件exe,现在是用Inno Setup6.2.1做安装包,以及给exe、及安装包exe、卸载exe做代码签名 一、准备工具 1、下载 下载 https://visualstudio.microsoft.com/zh-hans/visual-…

简单扫码登录原理分析与本地测试

前言 参考:https://www.cnblogs.com/johnlearning/p/16205875.html 前言:简单分析扫码登录流程。 场景:以网页版微信为例,我们在 PC 端点击二维码登录后,浏览器页面会弹出二维码图片,此时打开手机微信扫…

本地存储之indexedDB的操作api -- localforage的使用

文章目录 概述增删改查操作工具类封装前端api前端关键接口调用(以年度举例,其他维度类似)列表获取添加内容修改内容 概述 本地存储有好几种,每种的优缺点本文就不赘述了,一搜一大堆。 本文只介绍indexedDB的使用。 能…

Redis实现分页+多条件模糊查询组合方案

导言 Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,在Redis中通常根据数据的key查询其value值,Redis没有模糊条件查询,在面对一些需要分页、排序以及条件查询的场景时(如评论&…

spring boot 集成dubbo

本demo使用spring boot 2.4.1版本集成 dubbo 2.7.15 1.创建maven项目及其子模块 父工程pom.xml <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.ap…

个人微信开发API,微信机器人开发

安卓微信的api&#xff0c;个人微信开发API协议&#xff0c;微信 ipad &#xff0c;微信ipad协议&#xff0c;微信web版接口api&#xff0c;微信网页版接口&#xff0c;微信开发sdk&#xff0c;微信开发API&#xff0c;微信协议&#xff0c;微信接口文档&#xff0c;网页个人微…

不清晰的照片怎么变清晰?这几个方法轻松处理!

大家都会碰到老旧照片放大后变得模糊不清的情况&#xff0c;可惜我们无法在网上下载原图&#xff0c;这是我们自己的照片。那有没有简便的方法修复模糊照片呢&#xff1f;很多人会提到使用PS&#xff0c;但操作复杂需要基本技能。除了PS&#xff0c;还有其他方法修复模糊照片。…

图片速览 Deep k-Means: Jointly clustering with k-Means and learning representations

本文探讨了联合聚类与学习的问题 交涉。正如之前的几项研究表明&#xff0c;学习 既忠实于要聚类和调整的数据的表示形式 到聚类算法可以导致更好的聚类性能&#xff0c;所有的 更重要的是&#xff0c;这两项任务是联合执行的。我们在这里提出这样一个 方法的k-基于连续重新参数…

每天一道C语言编程练习(5):尼科彻斯定理

题目描述 验证尼科彻斯定理&#xff0c;即&#xff1a;任何一个整数m的立方都可以写成m个连续奇数之和。 输入格式 任一正整数 输出格式 该数的立方分解为一串连续奇数的和 样例输入 13 样例输出 13*13*132197157159161163165167169171173175177179181 代码如下&#…

【前端知识】React 基础巩固(二十七)——Fragment

React 基础巩固(二十七)——Fragment Fragment Fragment 允许将子列表分组&#xff0c;而无需向 DOM 添加额外节点可以采用语法糖<></>来替代 Fragment&#xff0c;但在需要添加 key 的场景下不能使用此短语 import React, { PureComponent, Fragment } from &q…

VUE之基本部署及VScode常用插件

参考资料&#xff1a; 参考视频 VScode常用插件清单 node.js官网 node.js官网中文版 VUE官方文档 VScode常用插件&#xff1a; VScode常用插件详解见上述连接&#xff0c;插件列表如下&#xff1a; VScode的注释/取消注释快捷键为&#xff1a;Ctrl/ VUE的基本安装部署--…

shardingsphere mybatisplus properties和yml配置实现、分页配置

shardingsphere mybatisplus properties和yml配置实现 目录结构 model package com.oujiong.entity;import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.format…

【JAVA】——环境配置安装

一.Java简介 1.1 Java的特点 Java是一种跨平台、面向对象的程序设计语言&#xff0c;用它编写的程序可以在任何计算机操作系统和支持Java的硬件设备上运行。Java是一种通过解释方式来执行的语言&#xff0c;那么什么是解释方式呢&#xff1f; 程序员编写的代码一般都是用高级语…

程序员的自我修养(2)

目标文件的学习 1.什么是目标文件以及格式 目标文件为编译器编译后生成的文件&#xff0c;就是window下的.obj&#xff0c;linux下的.o文件。与可执行文件格式几乎一样&#xff0c;因为只是缺少链接过程。所以可执行文件&#xff0c;动态链接库&#xff0c;静态链接库&#xf…

B070-项目实战-用户模块--手机注册

目录 用户模块需求分析静态网站部署与调试两种前端项目的部署两种前端项目的调试(热部署)创建静态web项目 注册分析与设计分析需求设计 界面设计&#xff08;ui&#xff09;设计表&#xff08;后台&#xff09; 流程设计&#xff08;后台&#xff09;三范式表设计流程设计 相关…

英语动词-分类及应用

文章目录 1.实义动词系动词情态动词 1.实义动词 实义动词是表示具体动词的词。 常见的分类&#xff1a;及物动词和不及物动词。 1.及物动词&#xff1a;transitive verb后面直接加宾语&#xff0c;并且必须加宾语。比如&#xff1a;I love you.I buy a book. 2.不及物动词&…

AI 智能对话 - ChatGLM2-6B 本地搭建入门

前情提要 这一个月来干了啥事情呢&#xff1f;AI 绘画搞了2周左右&#xff0c;SD 建筑绘图&#xff0c;训练 LORA &#xff0c;模型控制基本也上手了&#xff0c;可以按照预期生成自己想要的东西&#xff0c;那种控制感是挺开心的&#xff0c;不然你输入一句话生成 AI 图片完全…

Linux进程(三)---深入理解进程地址空间

目录 地址空间的划分及验证 所谓的地址空间是内存吗&#xff1f; 一种奇怪的现象(虚拟地址的引入) 什么是进程地址空间&#xff1f; 我们平常访问到的内存是物理内存吗&#xff1f; 深入理解区域划分 再谈奇怪的现象 fork()中为什么一个变量可以同时保存两个不同的值 …