当前位置:

首页 > 编程开发 > Java栈与队列怎么实现

Java栈与队列怎么实现

1、实现循环队列【OJ链接】循环队列一般通过数组实现。我们需要解决几个问题。(1)数组下标实现循环a、下标最后再往后(offset小于array.length):index=(index+offset)%array.length。通俗一点,就是如果我们的数组大小为8,下标走到了7,再往后如何回到0,我们可以(index+1)%8来实现。b、下标最前再往前的时候,我们特殊判断一下,将其置为数组大小减一即可。(2)区分队列的满与空我们可以给数组预留一个位置,如果rear+1=front,则表示队列已满;如果r

本文目录

      1、实现循环队列

      【OJ链接】

      循环队列一般通过数组实现。我们需要解决几个问题。

      (1)数组下标实现循环

      a、下标最后再往后(offset 小于 array.length): index = (index + offset) % array.length。通俗一点,就是如果我们的数组大小为8,下标走到了7,再往后如何回到0,我们可以(index+1)%8来实现。

      Java栈与队列怎么实现

      b、下标最前再往前的时候,我们特殊判断一下,将其置为数组大小减一即可。

      (2)区分队列的满与空

      我们可以给数组预留一个位置,如果rear+1=front,则表示队列已满;如果rear=front,表示队列为空。这个情况下,我们需要考虑队列大小的问题,在定义数组大小时,需要比原有的大一。

      Java栈与队列怎么实现

       【代码如下】

      class MyCircularQueue {
          public int front;
          public int rear;
          public int[] array;
       
          //构造方法
          public MyCircularQueue(int k) {
             //因为预留位置的缘故,数组的大小要定义为k+1
             this.array=new int[k+1];
          }
          //入队
          public boolean enQueue(int value) {
              if(isFull()){
                  return false;
              }
              this.array[this.rear]=value;
              this.rear=(this.rear+1)%this.array.length;
              return true;
          }
          //出队
          public boolean deQueue() {
              if(isEmpty()){
                  return false;
              }
              this.front=(this.front+1)%this.array.length;
              return true;
          }
          //获取队头
          public int Front() {
              if(isEmpty()){
                  return -1;
              }
              return this.array[front];
          }
          //获取队尾
          public int Rear() {
              if(isEmpty()){
                  return -1;
              }
              int index=-1;
              if(this.rear==0){
                  index=this.array.length-1;
              }else{
                  index=this.rear-1;
              }
              return this.array[index];
          }
          //判断是否为空
          public boolean isEmpty() {
              if(this.front==this.rear){
                  return true;
              }
              return false;
          }
          //判断队列是否满
          public boolean isFull() {
              if((this.rear+1)%this.array.length==this.front){
                  return true;
              }
              return false;
          }
      }

      2、队列实现栈

      【OJ链接】

      因为栈的先进后出、队列的先进先出原则。我们需要两个队列来实现栈。当两个队列都为空时,栈为空。

      • 入栈(push):第一次入栈无所谓,两个队列都为空,随便选择一个队列入队即可;后面入栈时,肯定会有一个队列不为空,找到不为空的队列,进行入队操作。

      • 出栈(pop):首先栈为空时,不能进行出栈操作;栈不为空时,肯定有一个队列为空(queue1),一个队列不为空(queue2),将queue1中的size-1个元素出栈到queue2中(特别注意不能将求queue1大小的函数放进循环里,queue进行出队操作时,其大小是改变的),最后将queue1中最后一个元素进行出队最为返回值。

      • 获取栈顶元素(top):和出栈差不多,就不细说了

      【代码如下】

      class MyStack {
          private Queue queue1;
          private Queue queue2;
       
          //构造方法
          public MyStack() {
              queue1=new LinkedList<>();
              queue2=new LinkedList<>();
          }
          //入栈
          public void push(int x) {
              if(!queue2.isEmpty()){
                  queue2.offer(x);
              }else{
                  queue1.offer(x);
              }
          }
          //出栈
          public int pop() {
              if(empty()){
                  return -1;
              }
              if(queue1.isEmpty()){
                  int size=queue2.size();
                  for(int i=0;i

      3、栈实现队列

      【OJ链接】

      还是和上面一样,需要用到两个栈(stack1、stack2)。和实现栈列不同的是,入队只能对同一个栈进行操作。如果两个栈都为空,则队列为空。

      • 入队(push):规定stack1用来入队。每次入队时,对stack1进行入栈操作即可。

      • 出队(pop):规定stack2进行出队操作。如果队列为空时,不能进行出队操作。当stack2为空时,我们需要将stack1中所有元素出栈,放入stack2中,然后对stack2进行出栈操作。如果stack2不为空,则直接对stack2进行出栈操作即可。

      • 获取队列开头元素(peek):和出栈操作相同,最后只需要获取stack2的栈顶元素即可。

      【代码如下】

      class MyQueue {
          private Stack stack1;
          private Stack stack2;
          //构造方法
          public MyQueue() {
              stack1=new Stack<>();
              stack2=new Stack<>();
          }
          //入队操作
          public void push(int x) {
              stack1.push(x);
          }
          //出队操作
          public int pop() {
              if(stack2.empty()){
                  int size=stack1.size();
                  for(int i=0;i

      4、实现最小栈

      【OJ链接】

      其实就是要在O(1)的时间复杂度内找到栈的最小元素。需要两个栈来实现,一个栈来进行出栈、入栈操作。只需要保证不管如何操作,另一个栈的栈顶元素都是当前栈的最小元素即可。

      两个栈stack1、stack2,站的操作都在stack1中:

      • 入栈:如果第一次入栈,我们需要将其也放入stack2中,之后的入栈,将入栈元素与stack2的栈顶元素进行比较,如果其小于stack2的栈顶元素,则将其放入stack2中。

      • 出栈:对stack1出栈时,将其与stack2的栈顶元素进行比较,如果其等于stack2的栈顶元素,则对stack2进行出栈操作。

      这样就能保证stack2的栈顶元素总是stack1的最小元素。注意:如果stack1中入栈两个相同的最小元素,都需要对stack2进行入栈。

      【代码如下】

      class MinStack {
          private Stack stack1;
          private Stack stack2;
          //构造方法
          public MinStack() {
              stack1=new Stack<>();
              stack2=new Stack<>();
          }
          //入栈
          public void push(int val) {
              stack1.push(val);
              if(stack2.empty()){
                  stack2.push(val);
              }else{
                  if(val<=stack2.peek()){
                      stack2.push(val);
                  }
              }
          }
          //出栈
          public void pop() {
              int x=stack1.pop();
              if(x==stack2.peek()){
                  stack2.pop();
              }
          }
          //获取栈顶元素
          public int top() {
              return stack1.peek();
          }
          //获取栈的最小元素
          public int getMin() {
              return stack2.peek();
          }
      }
      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发 Java
      相关文章 更多
      Java单元测试入门:使用JUnit 5编写第一个测试用例
      Java单元测试入门:使用JUnit 5编写第一个测试用例

      面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

      Java变量未初始化报错解析:局部变量与成员变量默认值差异
      Java变量未初始化报错解析:局部变量与成员变量默认值差异

      深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
      Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

      详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

      Java中final与static final常量的定义及初始化规则
      Java中final与static final常量的定义及初始化规则

      深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

      Java抽象方法与接口方法的区别及选型建议
      Java抽象方法与接口方法的区别及选型建议

      深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

      Java实现HTTP请求与JSON解析的完整代码示例
      Java实现HTTP请求与JSON解析的完整代码示例

      本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

      Java递归出现StackOverflowError的原因分析及栈空间优化方案
      Java递归出现StackOverflowError的原因分析及栈空间优化方案

      详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

      Java空指针异常(NPE)的代码排查与修复实例
      Java空指针异常(NPE)的代码排查与修复实例

      针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

      selenium上传文件教程本地文件路径设置方法
      selenium上传文件教程本地文件路径设置方法

      深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
      大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

      针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。