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

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://bridging.hnsdj.cn
http://anthropophagus.hnsdj.cn
http://camelry.hnsdj.cn
http://blip.hnsdj.cn
http://accessit.hnsdj.cn
http://bennington.hnsdj.cn
http://barbacan.hnsdj.cn
http://amortize.hnsdj.cn
http://attunement.hnsdj.cn
http://amygdalae.hnsdj.cn
http://antimonous.hnsdj.cn
http://andromache.hnsdj.cn
http://aerification.hnsdj.cn
http://ailing.hnsdj.cn
http://arteriotomy.hnsdj.cn
http://admonitory.hnsdj.cn
http://bak.hnsdj.cn
http://aftertax.hnsdj.cn
http://anthroponym.hnsdj.cn
http://afebrile.hnsdj.cn
http://calotte.hnsdj.cn
http://behavioural.hnsdj.cn
http://antispeculation.hnsdj.cn
http://augusta.hnsdj.cn
http://beneath.hnsdj.cn
http://boggle.hnsdj.cn
http://archenteric.hnsdj.cn
http://antemarital.hnsdj.cn
http://carpolite.hnsdj.cn
http://casserole.hnsdj.cn
http://www.dtcms.com/a/280075.html

相关文章:

  • 3d max 的快捷键
  • 极限状态下函数开根号的计算理解(含示意图)
  • Flink双流实时对账
  • CPU寄存器、进程上下文与Linux O(1)调度器原理
  • Jfinal+SQLite java工具类复制mysql表数据到 *.sqlite
  • 基于 vue+Cesium 实现军事标绘之钳击箭头绘制实战
  • C++-linux系统编程 8.进程(三)孤儿进程、僵尸进程与进程回收
  • Oracle学习专栏(五):性能优化
  • 适用于Windows系统截图工具
  • 通用综合文字识别联动 MES 系统:OCR 是数据流通的核心
  • 【算法-BFS 解决最短路问题】探索BFS在图论中的应用:最短路径问题的高效解法
  • JVM——JVM垃圾回收调优的主要目的是什么?
  • 行为模式-状态模式
  • C++ -- STL-- List
  • 分布式通信框架 - JGroups
  • 从零开始的云计算生活——第三十二天,四面楚歌,HAProxy负载均衡
  • 数据怎么分层?从ODS、DW、ADS三大层一一拆解!
  • 智慧园区:激活城市活力的数字化引擎
  • 【colab 使用uv创建一个新的python版本运行】
  • mac上的app如何自动分类
  • 22-C#的委托简单使用-2
  • 自增主键为什么不是连续的?
  • 基于多智能体强化学习的医疗检索增强生成系统研究—MMOA-RAG架构设计与实现
  • Uboot源码超详细分析(2)
  • 力扣25.7.15每日一题——有效单词
  • 对于编写PID过程中的问题
  • TCP可靠性设计的核心机制与底层逻辑
  • TDengine GREATEST 和 LEAST 函数用户手册
  • 26.将 Python 列表拆分为多个小块
  • SSM框架学习DI入门——day2