栈和队列(Java)

一.栈(Stack)

1.定义

栈是限定仅在表尾进行插入或删除操作的线性表

一般的表尾称为栈顶      表头称为栈底

栈具有“后进先出”的特点

2.对栈的模拟

栈主要具有以下功能:

  • push(Object item):将元素item压入栈顶。

  • pop():弹出栈顶元素,并将其从栈中删除。

  • peek():返回栈顶元素,但不删除它。

  • isEmpty():判断栈是否为空,返回布尔值。具体模拟代码我们可以用一个顺序表来实现如下

而在Java 编程应用idea中我们在使用时无需再进行模拟实现,可直接通过栈的实例化  然后直接进行调用栈的不同方法

实例化一个存储字符串类型的栈

则可直接stack.pop()....进行调用方法

3.括号匹配问题

链接如下: 

20. 有效的括号 - 力扣(LeetCode)

该题目就需要我们对于栈的功能的熟练掌握

需我们考虑三种括号不匹配情况从而考虑入栈和出栈的适配问题

以下是代码:

二.队列(Queue)

1.定义

与栈相反,队列是一种先进先出的线性表

插入一端成为队尾,删除一端称为队头

2.对队列的模拟

队列具有以下功能:

  • 1. offer(E e):添加元素到队列
    2.poll():移除并返回队列头部的元素
  • 3. peek():获取队列头部的元素,但不移除
    4.isEmpty():检查队列是否为空

以下队列的模拟我是借助链表来进行模拟实现

Java中idea也具有Queue队列 但队列是作为一个抽象类 所以

在实例化对象时需要向上转型

则可进行调用队列的方法:queue.offer();....

3.循环队列

循环队列是队列的一大重点

与队列不同的就是需要考虑队尾与对头的衔接

1.注意队空与队满的判断条件

队空的条件:q.front==q.rear;

队满的条件:(q.rear+1)%MaxSize==q.front;

2.代码详解

三.栈对队列的模拟以及队列对栈的模拟

1.队列对栈的模拟

225. 用队列实现栈 - 力扣(LeetCode)

class MyStack {

Queue<Integer>queue1 ;//申请第一个队列

Queue<Integer>queue2 ;//申请第二个队列

    public MyStack() {

        queue1=new LinkedList<>();

        queue2=new LinkedList<>();

    }

   

    public void push(int x) {//在模拟栈入队时 找两个队列中非空的队列

        if(!queue1.isEmpty()){

            queue1.offer(x);

        }

        else if(!queue2.isEmpty()){

            queue2.offer(x);

        }

        else{

            queue1.offer(x);

        }

    }

   

    public int pop() {//出队列时将非空队列中size-1个元素入另一个队列中,留下的即为模拟栈该出栈的元素

        if(empty()){

            return -1;

        }

if(!queue1.isEmpty()){

    int size=queue1.size();

    for(int i=0;i<size-1;i++){

        queue2.offer(queue1.poll());

    }

    return queue1.poll();

}

else{

    int size=queue2.size();

     for(int i=0;i<size-1;i++){

        queue1.offer(queue2.poll());

    }

    return queue2.poll();

}

       

    }

   

    public int top() {

        if(empty()){

            return -1;

        }

        if(!queue1.isEmpty()){

            int val=0;

            int size=queue1.size();

          for(int i=0;i<size;i++){

            val=queue1.poll();

            queue2.offer(val);

          }

          return val;

        }

        else{

            int val=0;

            int size=queue2.size();

          for(int i=0;i<size;i++){

            val=queue2.poll();

            queue1.offer(val);

          }

          return val;

        }

    }

    public boolean empty() {

        return queue1.isEmpty()&&queue2.isEmpty();

    }

}

2.栈对队列的模拟

232. 用栈实现队列 - 力扣(LeetCode)

注意结合栈的特性以两个栈来结合使队列的先进后出成功进行

class MyQueue {

public Stack <Integer>  stack1;

public Stack <Integer> stack2;

    public MyQueue() {

        stack1=new Stack<>();

        stack2=new Stack<>();

    }

   

    public void push(int x) {

        if(empty()){

            stack1.push(x);

        }

        if(stack1.isEmpty()){

            stack2.push(x);

        }

        else{

            stack1.push(x);

        }

    }

    public int pop() {

        if(empty()){

            return -1;

        }

        if(!stack2.isEmpty()){

            return stack2.pop();

        }

        else{

         while(!stack1.isEmpty()){

              stack2.push(stack1.pop());

            }

            return stack2.pop();

        }

    }

   

    public int peek() {

        if(empty()){

            return -1;

        }

        if(stack1.isEmpty()){

             int sz=stack2.size();

            int num=0;

            for(int i=0;i<sz;i++){

                num=stack2.pop();

              stack1.push(num);

            }

            return stack1.peek();

        }

        else{

            int sz=stack1.size();

            int num=0;

            for(int i=0;i<sz;i++){

                num=stack1.pop();

              stack2.push(num);

            }

            return stack2.peek();

        }

    }

   

    public boolean empty() {

        return stack1.isEmpty()&&stack2.isEmpty();

    }

}

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

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

相关文章

Angular 和 Vue2.0 对比

前言 &#xff1a;“业精于勤&#xff0c;荒于嬉&#xff1b;行成于思&#xff0c;毁于随” 很久没写博客了&#xff0c;大多记录少进一步探查。 Angular 和 Vue2.0 对比&#xff1a; 一.概念 1.1 Angular 框架&#xff1a; 是一款由谷歌开发的开源web前端框架&#xff08;核…

Android 项目模型配置管理

Android 项目配置管理 项目模型相关的配置管理config.gradle文件&#xff1a;build.gradle文件&#xff1a; 参考地址 项目模型相关的配置管理 以下是一个完整的build.gradle和config.gradle示例&#xff1a; config.gradle文件&#xff1a; ext {// 模型相关配置&#xff0…

前端知识点---Javascript中检测数据类型函数总结

文章目录 01 typeof 运算符02 instanceof 运算符03 Array.isArray()04 Object.prototype.toString.call()05 constructor 属性06 isNaN() 和 Number.isNaN() (常用)07 isFinite() 和 Number.isFinite()08 typeof null 是 "object" 的问题 01 typeof 运算符 返回值是…

MAC 安装 brew及其常用命令

​文章&#xff1a;Mac安装brew的四种方法&#xff08;指定能行&#xff09; 以下是在 Mac 上使用 Homebrew 清理缓存和无用包的详细指南&#xff1a; 1. 查看系统状态 # 诊断系统问题 brew doctor# 查看已安装的包 brew list# 查看系统占用空间 brew cleanup -n # 预览需要…

基于Multisim数字电子秒表0-60S电路(含仿真和报告)

【全套资料.zip】数字电子秒表电路Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.秒表最大计时值为60秒&#xff1b; 2. 2位数码管显示&#xff0c;分辨率为1秒&#xff1b; 3.具有清零…

安卓智能指针sp、wp、RefBase浅析

目录 前言一、RefBase1.1 引用计数机制1.2 设计目的1.3 主要方法1.4 如何使用1.5 小结 二、sp和wp2.1 引用计数机制2.2 设计目的2.3 主要方法2.3.1 sp2.3.2 wp 2.4 如何使用2.5 小结 四、参考链接 前言 安卓底层binder中&#xff0c;为什么 IInterface要继承自RefBase &#x…

【论文笔记】Prefix-Tuning: Optimizing Continuous Prompts for Generation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Prefix-Tuning: Optimizin…

【Web前端】从回调到现代Promise与Async/Await

异步编程是一种让程序能够在等待某些操作完成的同时继续执行其他任务的关键技术&#xff0c;打破了传统编程中顺序执行代码的束缚。这种编程范式允许开发者构建出能够即时响应用户操作、高效处理网络请求和资源加载的应用程序。通过异步编程&#xff0c;JavaScript 能够在执行耗…

如何自己实现事件的订阅和发布呢?

1.原理 核心思想是基于发布/订阅模式&#xff0c;用一个共享的数据结构来管理事件和事件监听器。主要功能包括事件订阅、取消订阅、发布事件等功能。 实现思路 定义事件和监听器接口&#xff1a;首先定义一个 Event 类和一个 EventListener 接口&#xff0c;所有事件和监听器…

【CSS】“flex: 1“有什么用?

flex 属性的组成 flex 属性是一个复合属性&#xff0c;包含以下三个子属性&#xff1a; flex-grow&#xff1a;决定元素在容器中剩余空间的分配比例。默认值为 0&#xff0c;表示元素不会扩展。当设置为正数时&#xff0c;元素会按照设定比例扩展。flex-shrink&#xff1a;决…

计算机课程管理:Spring Boot与工程认证的协同创新

3系统分析 3.1可行性分析 通过对本基于工程教育认证的计算机课程管理平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本基于工程教育认证的计算机课程管理平…

vuepress配置谷歌广告-通过vue-google-adsense库

在 VuePress 中可以使用 vue-google-adsense 插件来配置 Google AdSense 广告&#xff0c;这个库可以简化在 VuePress 项目中插入广告的过程。 以下是使用 vue-google-adsense 配置广告的步骤&#xff1a; 1. 安装 vue-google-adsense 库 在你的 VuePress 项目根目录下安装 …

深度学习:解码器如何与编码器交互的过程

解码器如何与编码器交互的过程 在序列到序列的神经网络模型中&#xff0c;解码器与编码器的交互是实现有效翻译、文本生成等任务的关键环节。这种交互主要是通过编码器-解码器注意力机制&#xff08;通常称为跨注意力机制&#xff09;来实现的&#xff0c;它允许解码器在生成每…

通过VirtualBox虚拟机安装和调试编译好的 ReactOS

1. 首先创建一个虚拟机配置脚本 setup_vm.bat&#xff1a; batch echo off :: setup_vm.bat :: 设置路径 set "REACTOS_BUILDE:\Reactos_WinDriver\reactos-master\build" set "VM_PATHE:\VMs\ReactOS_Debug" set "VBOX_MANAGEC:\Program Files\Ora…

Kubernetes-Kubectl篇-01-常用命令

kubectl 常见命令 登录命令 根据机器ip使用kubectl登录机器(field-selector): #!/bin/bash export targetIp"6.0.90.240"#alias kubectlkubectl alias kubectlkubectl --kubeconfig/Users/king/.kube/sa128.configpodinfokubectl get pod --all-namespaces --fiel…

【SpringBoot】18 上传文件到数据库(Thymeleaf + MySQL)

Git仓库 https://gitee.com/Lin_DH/system 介绍 使用 Thymeleaf 写的页面&#xff0c;将&#xff08;txt、jpg、png&#xff09;格式文件上传到 MySQL 数据库中。 依赖 pom.xml <!-- https://mvnrepository.com/artifact/com.mysql/mysql-connector-j --><depende…

Kubernetes实现故障转移和微服务弹性伸缩

以下是在Kubernetes&#xff08;k8s&#xff09;中实现故障转移和高可用的方法及详细操作步骤&#xff1a; 一、通过Kubernetes Deployment实现故障转移&#xff08;多实例部署&#xff09; 方法概述&#xff1a; 通过创建Deployment资源并设置多个副本&#xff0c;Kubernete…

Sharding运行模式、元数据、持久化详解

运行模式 单机模式 能够将数据源和规则等元数据信息持久化&#xff0c;但无法将元数据同步至多个Sharding实例&#xff0c;无法在集群环境中相互感知。 通过某一实例更新元数据之后&#xff0c;会导致其他实例由于获取不到最新的元数据而产生不一致的错误。 适用于工程师在本…

Go语言进阶之Context控制并发

Context Context是Go语言中一个用于传递请求范围的上下文信息的标准库包&#xff0c;其主要用于处理并发操作中请求的生命周期的管理。 协程如何退出 利用协程退出的例子来说明Context的作用&#xff0c;以及没有使用Context&#xff0c;应该如何在没有执行完代码时提前退出…

挖掘web程序中的OAuth漏洞:利用redirect_uri和state参数接管账户

本文探讨了攻击者如何利用OAuth漏洞&#xff0c;重点是滥用redirect_uri和state参数以接管用户账户。如果redirect_uri参数验证不严&#xff0c;可能会导致未经授权的重定向到恶意服务器&#xff0c;从而使攻击者能够捕获敏感信息。同样&#xff0c;state参数的错误实现可能使O…