Java语言---栈与队列

news2024/11/27 12:58:34

目录

一.栈

1.1栈的概念

1.2.栈的实现 

1.2.1数组实现 栈

           栈的创建

            栈的基本方法实现

1.2.2链表实现 栈

            栈的创建

           栈的基本方法实现  

二.队列

      2.1队列的概念

      2.2队列的实现

       2.3代码实现

2.3.1队列代码的构建      

  2.3.2 队列  基础方法实现

总结


😽个人主页: tq02的博客_CSDN博客-C语言,Java,Java数据结构领域博主
 🌈梦的目标:努力学习,向Java进发,拼搏一切,让自己的未来不会有遗憾。
 🎁欢迎各位→点赞👍 + 收藏⭐ + 评论📝+关注✨
  本章讲解内容:栈与队列 的讲解

 使用编译器:idea

一. 栈

1.1栈的概念

       栈,一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作,可以想象为储物箱,可以放东西进去,也可以把东西取出来,但重点是,想取先放的东西,必须先将上层的东西取出。俗称:先进后出。

如图,C想入栈,只能放在最顶层,当要出栈时,也只能先取最高层 。

专业术语:  压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
                    出栈:栈的删除操作叫做出栈。出数据在栈顶。

1.2.栈的实现 

       栈的实现,可以采取数组方式,也可以采取链表方式。无论代码怎么敲,只要可以实现栈的基本概念就行。

1.2.1数组实现 栈

  栈的创建

class Mystack{
    private in[] elem;
    //存储的元素个数
    private int size;
    //如果没有给予空间,自动初始化
    Mystack(){
    elem=new int[10];
    }
    //主动赋值空间。
    Mystack(int num){
    elem=new int[num];
    }

}

 栈的基本方法实现

    判断栈是否为空

//判断是否为空 
public boolean isEmpty() {
   	return size == 0;
   }

只需要判断记录数组储存元素数量的变量是否为零即可。

 判断栈是否需要扩容

public void isFull(){
    if(size==elem.length)
    {
        this.elem = Arrays.copyOf(this.elem,this.size*2);
    }
}

只需要判断数组存储元素是否等于容器大小。

  向栈添加元素(入栈)

public void Put(int num)
{
    isFull();
     elem[size]=num;
    size++;
}

元素入栈需要判断是否栈是否满,需要扩容。

从栈中移出元素(出栈)

public void Pop()
{
    if(!isEmpty())
    {
      elem[size]=0;
       size--;
    }
  
}

先判断是否为空栈,如果为空,无法移除元素,如果不为空直接size--;元素减一。


1.2.2链表实现 栈

    栈的创建

public class MyStack{
      static class stack{
        private int val;
        private stack next;
        stack(){};
        stack(int num){
            this.num=num;
        }
//定义一个节点,为栈顶;
    stack pophead=null;

//判断栈是否为空
	public boolean isEmple(){};
//添加元素入栈
    public void Pop(int num){};
//移出元素 出栈
    public void remove(){};

  栈的基本方法实现  

  判断栈是否为空

public boolean isEmpty()
{
    return pophead==null?true:false
;
}

向栈添加元素(入栈)

public void Pop(int num)
{
    if(isEmpty())
    {
        head.val=num;
    }
    else if{
    stack kk=new stack(num);
    kk.next=pophead;
    pophead=kk;
    }
}

先判断头结点是否为空,如果头结点为空,则直接赋值给头结点,使用链表的头插法,将元素放在首位。

  从栈中移出元素(出栈)

public void remove()
{    if(isEmpty())
    {  
        return;
    }
   pophead=pophead.next;
}

移出首位元素,链表的头删法。


二.队列

2.1队列的概念

 队列:相当于单行车道,只允许一端出,一端进。分别对应删除元素增加元素

 队头:删除元素    对尾:增加元素

2.2队列的实现

        哪种存储方式符合队列的性质呢?第一种:数组       第二种:链表。

数组实现:

   

如图所示:使用数组,如果插入元素,则全体元素向后移动一位,再将首元素为 8。就可以实现了。但是需要记 末尾元素的下标值。

 链表实现:

 链表存放,采取头插法,每一个新进入的元素,插在头部。

 2.3代码实现

2.3.1队列代码的构建      

    我们采取使用链表的方法实现,以下是链表的构建。

public class Queue {
// 双向链表节点
    public static class ListNode{
    ListNode next;
    int value;
    ListNode(int value){
    this.value = value;
    }
  } 
    ListNode first; // 队头
    ListNode last; // 队尾
    int size = 0;

// 入队列---向链表位置插入新节点
public void offer(int e){};

// 出队列---将双向链表第一个节点删除掉
public int poll();

// 获取队头元素---获取链表中第一个节点的值域
public int peek();

//获取队列长度
public int size();

//判断队列是否为空
public boolean isEmpty();

  2.3.2 队列  基础方法实现

入队:

public void offer(int e){
    ListNode newNode = new ListNode(e);
  //设置一个新的结点,存放该元素,此时会面临2种情况
     第一种,该链表为空链表,第一次插入元素。
     第二种,该链表有元素,此时需要使用头插法。
    if(first == null){
      first = newNode;
    }else{
      newNode.next= first;
      first=newNode;
      } 
   size++;   //元素加一
}

出队:

// 1. 队列为空
// 2. 队列中有元素---链表中有一至多个节点----将末尾节点删除
public int poll(){
    ListNode newNode =first;
    int value = 0;
    if(first == null){
        return null;
    }else {
    while(newNode.next!=null)
    {
        newNode=newNode.next;
    }
    value=newNode.value;
     newNode=null;  //将最后的一个结点置空。
} 
    --size;
    return value;
}

 获取队头元素:

public int peek(){
    if(first == null){
    return null;
    }
   return first.value;
}

 获取队列长度:

public int size() {
  return size;
}

 判断队列是否为空:

public boolean isEmpty(){
  return first == null;
}

总结

        栈与队列,说到底也就是一种逻辑结构,可以用很多种方法实现。

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

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

相关文章

深入理解2D卷积和3D卷积

文章目录 卷积核的维度2D卷积单通道多通道代码example2d卷积操作后变化 3D卷积单通道多通道代码 在项目中用到了conv3但是对其背后的原理还有一些模糊的地方,conv2d与多通道的conv2d的区别在哪里?conv3d的思想理论是什么?对此进行探究和记录……

「AI之劫」:当机器超越人类底线,正在侵犯我们的创造力和道德

随着AI技术的不断发展,AI生成内容(AIGC)已经成为数字娱乐、商业营销和学术研究等领域的热门话题。随着人工智能技术的不断发展越来越多的领域开始应用AI技术,其中之一就是内容生成领域。 AIGC全称为AI-Generated Content, 指基于生…

2023年5月广州/深圳制造业产品经理很适合考的证书-NPDP

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

【利用AI让知识体系化】入门Egg框架(含实战)

思维导图 文章目录 思维导图第一章:概述1.1 Egg.js 简介1.2 Egg.js 的架构和优势1.3 Egg.js 的基本组件和插件 第二章:环境搭建2.1 Node.js 环境安装和配置2.2 Egg.js 应用创建和项目结构介绍2.3 Egg.js 应用部署和启动 第三章:基本开发3.1 路…

经纬恒润新产品系列 | 这款AR-HUD将颠覆你的认知

随着科技的发展与突破,智能化产品在汽车领域扮演了越来越重要的角色。本文即将介绍**经纬恒润新产品——AR-HUD(增强现实抬头显示系统),**它可以将科幻电影中的驾驶场景变为现实——将信息投影在挡风玻璃上,基于此功能…

开发环境搭建和创建STM32工程

目录 一、开发环境搭建 1. STM32CubeMX 2.Keil安装 二、创建STM32工程 一、开发环境搭建 1. STM32CubeMX ST公司出品 工具链接 https://www.st.com/zh/development-tools/stm32cubemx.html STM32CubeMX是一种图形工具,通过分步过程可以非常轻松地配置STM32微控制器和…

coolshell 镜像备份站点

缅怀技术大佬做的一个镜像站点 - RIP 消息刚开始是在推特传开,后面得到了家人同事的证实。噩耗! worldpeople2019 太意外了!中年程序员,感觉年龄跟我差不多,怎么就这么突然去世了?!诸位码农朋友…

Python爬虫进阶(1),Django+Selenium+Mysql+SimpleUI,从零开始搭建自己的爬虫后台管理系统

如果爬虫做完的话都会发现每个文件要么保存到csv或者是其他格式的文件中,这样做多少会有些麻烦,所以需要将这些内容保存起来方便自己管理和查看内容。 相对于flask而言Django有着相对成熟的一个后台管理系统配合上其他一些插件就可以做到即插即用的效果…

hive安装及配置

hive安装和部署 Hive地址 1.Hive官网地址 http://hive.apache.org/ 2.文档查看地址 https://cwiki.apache.org/confluence/display/Hive/GettingStarted 3.下载地址 http://archive.apache.org/dist/hive/ 4.github地址 http…

全新版本,手把手教你配置c\c++

上一篇图片多,语句乱,内容乱 这一篇采用全新的教程 这次在不删软件的前提下进行 老规矩先把之前看的教程残余删除 如果你有很多插件和设置这边建议先备份 打开c盘,在搜索栏里输入你的用户名 在箭头位置搜索你的用户名,就是你…

通过Python的wordcloud库将单词生成词云(心形形状)

文章目录 前言一、wordcloud库是什么?二、安装wordcloud库三、查看wordcloud库版本四、使用方法1.引入库2.定义图片路径3.定义需要分词的文本4.采用jieba搜索引擎模式分词5.加载心形图片6.创建词云对象7.生成词云8.保存词云图9.词云图效果 总结 前言 大家好&#xf…

第十五章 使用iSCSI服务部署网络存储

文章目录 第十五章 使用iSCSI服务部署网络存储一、iSCSI技术介绍1、硬盘接口类型 二、创建RAID磁盘阵列1、添加四块硬盘2、创建RAID磁盘阵列 三、配置iSCSI服务端1、iSCSI服务的和客户端的操作系统以及IP地址2、安装targetcli3、配置服务端共享资源4、创建iSCSI target名称及配…

B.Conveyor Belts

Codeforces Round 863 (Div. 3) 题目链接 题目大意: 有个矩阵传送带,从其中一个传送带跳到邻近的传送带需要消费一点能量。问从 x 1 , y 1 x_1,y_1 x1​,y1​到 x 2 , y 2 x_2,y_2 x2​,y2​最少要多少能量 个人题解: 我只需要算出该点在哪个…

强化学习笔记-05 蒙特卡罗方法Monte Carlo Method

本文是博主对《Reinforcement Learning- An introduction》的阅读笔记,不涉及内容的翻译,主要为个人的理解和思考。 上一节介绍了通过动态规划法来解决强化Markov decision process MDP环境下的学习问题, 动态规划法假设环境是完全可知&#…

APP测试常见功能测试点汇总,赶紧来记笔记

目录 1、安装和卸载 2、运行 3、注册和登录 4、日历控件 5、权限设置 6、软件更新  7、网络环境 8、兼容性测试:   9、异常测试   1、安装和卸载 安装和卸载是任何一款APP中都属于最基本功能。一旦出错,就属于优先级为紧要的BUG。因此APP…

三十六、链路追踪、配置中心

1、链路追踪 在一次调用链路中,可能设计到多个微服务,如果在线上,某个微服务出现故障,如何快速定位故障所在额微服务呢。 可以使用链路追踪技术 1.1链路追踪介绍 在大型系统的微服务化构建中,一个系统被拆分成了许多微…

Ambari-2.7.7源码编译

0 说明 本文基于Ambari-2.7.7版本进行源码编译。所需的编译资料统一提供如下: 链接:https://pan.baidu.com/s/1F2D7zBGfKihxTBArnOilTw 提取码:8m17 1 前提条件 1.1 下载ambari源码包 wget https://github.com/apache/ambari/releases/t…

【代码调试】《Multi-scale Positive Sample Refinement for Few-shot Object Detection》

论文地址:https://arxiv.org/abs/2007.09384#:~:textMulti-Scale%20Positive%20Sample%20Refinement%20for%20Few-Shot%20Object%20Detection.,previous%20attempts%20that%20exploit%20few-shot%20classification%20techniques%20 代码地址:https://git…

什么是低代码开发?低代码开发可以解决哪些问题?

一、什么是低代码开发? 低代码可以理解为是一种全新的应用开发理念。主要以可视化、参数化的系统配置方式来进行程序应用的开发,因此可以大幅度减少代码编写的工作,从而提高开发效率。 低代码平台则是通过对于业务场景进行高度抽象、提炼&a…

复习之Linux中的名词解释

1.什么是Linux? 严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。因此LinuxLinux内核GNU软件 2.什么是Shell? Shell是系统的用户界面&…