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

栈(Stack)和队列(Deque、Queue)

文章目录

  • 一、栈
    • 1.1 栈 VS 虚拟机栈 VS 栈帧
    • 1.2 数据结构 -- 栈介绍
    • 1.3 用数组模拟实现栈
    • 1.4 栈的功能:逆序打印
  • 二、队列
    • 2.1 数据结果 -- 队列介绍
    • 2.2 用单链表模拟实现Queue队列

一、栈

1.1 栈 VS 虚拟机栈 VS 栈帧

  1. 区别
    • :是一种数据结构
      • 任何数据结构都是用来组织描述数据的
    • 虚拟机栈(JVM虚拟机栈):是系统的一块内存
    • 栈帧:方法调用的时候,在虚拟机栈上开辟的内存区域

1.2 数据结构 – 栈介绍

  1. 栈的特点:只允许在固定的一端进行插入和删除元素操作,且是先进后出的
    在这里插入图片描述
  2. Java中如何使用栈
    • Stack<类型> stack = new Stack<>();
    • 上述方法用得越来越少了,现在多用【ArrayDequeue】代替
  3. 栈是如何实现的
    在这里插入图片描述
  4. 关于模拟实现栈:可以用数组/链表,Java中的Stack底层是用数组实现的
    • 用数组实现:看下面
    • 用链表实现
      在这里插入图片描述

1.3 用数组模拟实现栈

  1. 实现结构
    • 此处设计是整型数组
    • 使用usedSize记录当前有序的数据,插入元素时可以把它当成下标
  2. 添加元素 push():如果数组满了需要扩容
  3. 删除元素 pop():栈不为空时才出元素
  4. 获取栈顶元素 peek():栈不为空时才能获取
public class MyStack {private int[] elem;private int usedSize;public MyStack() {this.elem = new int[5];}//压栈 --- 放元素public void push(int val) {if(isFull()) {elem = Arrays.copyOf(elem,2*elem.length);}elem[usedSize] = val;usedSize++;}public boolean isFull() {return usedSize == elem.length;}//出栈public int pop() {if(empty()) {throw new StackEmptyException("栈为空!");}return elem[--usedSize];}//获取栈顶元素public int peek() {if(empty()) {throw new StackEmptyException("栈为空!");}return elem[usedSize-1];}public boolean empty() {return usedSize == 0;}
}
//这是设计的自定义异常
public class StackEmptyException extends RuntimeException{public StackEmptyException() {}public StackEmptyException(String message) {super(message);}
}

1.4 栈的功能:逆序打印

  1. 解析:如果我们要将一个递归实现的代码改成非递归,基本会用到栈/队列
  2. 代码
    在这里插入图片描述

二、队列

2.1 数据结果 – 队列介绍

  1. 队列特点:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,且是先进先出

  2. Java中如何使用队列

    • Deque 双端队列
      在这里插入图片描述

    • Queue 队列
      在这里插入图片描述

  3. 关于Queue队列的模拟实现:数组和链表都可以实现

    • 用数组实现
      在这里插入图片描述
      在这里插入图片描述

    • 用链表实现
      在这里插入图片描述

2.2 用单链表模拟实现Queue队列

public class MyQueue {public ListNode head;public ListNode last;static class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val = val;}}private int usedSize;public void offer(int val) {ListNode node = new ListNode(val);if(head == null) {head = node;last = node;}else {last.next = node;last = last.next;}usedSize++;}public int getUsedSize() {return usedSize;}public int poll() {if(head == null) {return -1;}int val = -1;if(head.next == null) {val = head.val;head = null;last = null;return val;}val = head.val;head = head.next;usedSize--;return val;}public int peek() {if(head == null) {return -1;}return head.val;}}

http://www.mrgr.cn/news/69157.html

相关文章:

  • 畅聊未来-- AIGC 的发展方向与趋势
  • Wi-Fi背后的工作原理与技术发展历程介绍【无线通信小百科】
  • Spring Boot 中使用 @Transactional 注解配置事务管理
  • see的本质是什么?
  • redisson内存泄漏问题排查
  • Chromium 中sqlite数据库操作演示c++
  • OSPF总结
  • 一键分发平台哪个方式最好?老板一人轻松运营500名员工的实战经验分享!(从零开始,不走弯路!)
  • Linux下通过sqlplus连Oracle提示字符是乱码▒▒▒[
  • 从《梅艳芳》到《焚城》,王丹妮实力诠释剧抛脸
  • leetcode 832.翻转图像
  • [CKS] kube-batch修复不安全项
  • [Python学习日记-63] 继承与派生
  • 算法 -插入排序
  • 从 iPhone 设备恢复误删微信消息的 4 种方法
  • C++ --- 异步编程
  • 一致性哈希算法详解
  • 理想汽车Android面试题及参考答案
  • 本地连接IP地址的自主设置指南‌
  • Clifford数
  • ONLYOFFICE 8.2深度测评:开源的办公套件
  • C#设计原则
  • Seata — 分布式事务
  • AI产品经理必修课:关键AI技术知识概览
  • vue之组件网站(后续补)
  • 自制操作系统(九、操作系统完整实现)