当前位置: 首页 > ai >正文

Java 栈和队列

文章目录

    • 模拟实现栈
    • 面试题
    • 栈,虚拟机栈,栈桢
  • 队列
    • 模拟实现队列
    • 循环队列
    • 双端队列
    • 面试题

  1. 先进后出的方式组织数据

模拟实现栈

在这里插入图片描述

  1. 数组组织栈
package Stack;import java.util.Arrays;public class MyStack implements IStack{private int[] elem;private int usedSize;private static final int DEFAULT_CAPACITY = 10;public MyStack(){elem = new int[DEFAULT_CAPACITY];}public boolean full(){if(usedSize == elem.length){return true;}return false;}@Overridepublic void push(int x) {if(full()){elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize++] = x;}@Overridepublic int pop() {if(empty()){// 抛异常throw new EmptyException("栈空了");}int k = usedSize;usedSize--;// 相当于删除// 如果是引用类型// elem[usedSize] = null;return elem[k-1];}@Overridepublic int peek() {if(empty()){throw new EmptyException("栈为空");}return elem[usedSize - 1];}@Overridepublic int size() {return usedSize;}@Overridepublic boolean empty() {return usedSize == 0;}
}
  1. 用链表实现栈
    可以用双向链表实现栈
    在这里插入图片描述

面试题

逆波兰表达式
有效的括号
栈的压入,弹出序列
最小栈
在这里插入图片描述

栈,虚拟机栈,栈桢

  1. 栈:是一种数据结构
  2. 虚拟机栈:是JVM开辟的一块内存
  3. 栈桢:是函数调用时在虚拟机中给这个方法开辟的一块内存

队列

  1. 队列:组织数据的方式是先进先出,队尾入数据,队头出数据
    在这里插入图片描述

  2. add和offer都是入队,remove和poll都是删除元素,element和peek都是获取队头元素
    在这里插入图片描述

模拟实现队列

  1. 使用双向链表模拟实现队列
  2. 入栈,出栈,获取栈顶元素,获取栈的大小,判空
package queuedemo;public class MyLinkQueue {static class ListNode{public int val;public ListNode next;public ListNode prev;public ListNode(int val){this.val = val;}}public int usedSize;public ListNode head;public ListNode last;// 链表的尾插法public boolean offer(int val){ListNode node = new ListNode(val);if(head == null){head = node;last = node;}else{last.next = node;node.prev = last;last = node;}usedSize++;return true;}// 头删public int poll(){ListNode node;if(!isEmpty()){node = head;head = head.next;if(head != null){head.prev = null;}else{last = null;}}else{throw new NullIndexException("队列为空");}usedSize--;return node.val;}// 获取队头元素public int peek(){if(head == null){return -1;}return head.val;}public boolean isEmpty(){return head == null;}public int size(){return usedSize;}
}

循环队列

  1. 数组可以实现队列吗?

循环队列

在这里插入图片描述

  1. rear是可以存放数组元素的下标

在这里插入图片描述
3. 如何判断队列是空和满?
浪费一个空间来表示满
如果front == rear,那么就是空
如果front的下一个空间是rear,那么就是满

在这里插入图片描述
使用usedSize来记录是否满了

使用标记
第一次相遇标记一下,第二次相遇再标记一下,证明是满了

rear =(rear + 1)% len 表示下一个位置的下标
rear + 1 == front 表示满
front = (front + 1) % len

  1. rear如何从7下标来到0下标?

在这里插入图片描述
循环队列

class MyCircularQueue {public int[] elem;public int front;// 队头public int rear;// 队尾public MyCircularQueue(int k) {// 我们有一个空间要浪费掉elem = new int[k + 1];}// 入队public boolean enQueue(int value) {if(isFull()){return false;}elem[rear] = value;rear = (rear + 1) % elem.length;return true;}// 出队public boolean deQueue() {if(isEmpty()){return false;}// 出队,front++front = (front + 1) % elem.length;return true;}// 获取队头元素public int Front() {if(!isEmpty()){return elem[front];}return -1;}// 获取队尾元素public int Rear() {// rear - 1// (rear + elem.length - 1) % elem.length;if(!isEmpty()){int k = (rear + elem.length - 1) % elem.length;// int k = (rear == 0) ? elem.length - 1 : rear - 1;  return elem[k];}return -1;}public boolean isEmpty() {return front == rear;}public boolean isFull() {int k = (rear + 1) % elem.length;return k == front;       }
}

双端队列

  1. 可以从头进,从头出,从尾入,从尾出
  2. 不仅可以当做队列和栈还可以当做链表
// 链表的双端队列
Deque<Integer> deque = new LinkedList<>();
// (顺序的)数组双端队列
Deque<Integer> deque1 = new ArrayDeque<>();

面试题

用队列实现栈
在这里插入图片描述

用栈实现队列

http://www.xdnf.cn/news/15388.html

相关文章:

  • linux 系统依赖包查询命令汇总
  • IPM31主板E3300usb键盘鼠标安装成功Sata接口硬盘IDE模式server2003-nt-5.2.3790
  • python 的包管理工具pip poetry、conda 和 pipenv 使用和安装
  • C 语言部分操作符详解 -- 进制转换,原码、反码、补码,位操作符,逗号表达式,操作符的优先级和结合性,整型提升,算术转换
  • 2025年小目标检测分享:从无人机视角到微观缺陷的创新模型
  • 【PTA数据结构 | C语言版】二叉树前序序列化
  • Python初学者笔记第十二期 -- (集合与字典编程练习题)
  • Vim多列操作指南
  • TCP可靠性设计的核心机制与底层逻辑
  • next.js 登录认证:使用 github 账号授权登录。
  • uni-app+vue3 来说一说前端遇到跨域的解决方案
  • 全连接神经网络
  • 10分钟搞定!Chatbox+本地知识库=你的私人语音导师:企业级全栈实现指南
  • 自动微分模块
  • JAR 包冲突排雷指南:原理、现象与 Maven 一站式解决
  • 机载激光雷达目标识别:从点云到凝视成像的算法全景
  • Datawhale AI夏令营——用户新增预测挑战赛
  • xss-lab靶场通关
  • 苦练Python第18天:Python异常处理锦囊
  • 从 JSON 到 Python 对象:一次通透的序列化与反序列化之旅
  • 云原生技术与应用-Containerd容器技术详解
  • Android系统的问题分析笔记 - Android上的调试方式 bugreport
  • RAG索引流程中的文档解析:工业级实践方案与最佳实践
  • iOS —— 网易云仿写
  • 大数据系列之:通过trino查询hive表
  • 直播推流技术底层逻辑详解与私有化实现方案-以rmtp rtc hls为例-优雅草卓伊凡
  • 在Linux下git的使用
  • 量子计算新突破!阿里“太章3.0”实现512量子比特模拟(2025中国量子算力巅峰)
  • MYOJ_8512:CSP初赛题单1:计算机常识
  • 计算机网络通信的相关知识总结