代码随想录算法训练营第十天 | 栈和队列

目录

  • java 中的栈
  • java 中的队列

LeetCode 232.用栈实现队列
LeetCode 225. 用队列实现栈

java 中的栈

栈是一种数据结构 先进后出
java 中栈可以用 Stack 类表示。也可以用 Deque(双端队列)和 LinkedList 类表示。
压栈(push)、出栈(pop)、查看栈顶元素(peek)和获取栈的大小(size)。

Stack 类
底层是数组。
压栈时,元素会被加入数组的末尾;出栈时,数组末尾的元素被弹出。查看栈顶元素时,返回数组末尾的元素即可。
数组实现的栈的优点是速度快、效率高。缺点是数组大小是固定的,当栈中的元素数量超过数组大小时,需要进行扩容。扩容会带来额外的空间和时间开销。
另一种实现栈的方式是使用链表。链表实现的栈可以动态地增加和删除元素,不需要扩容。

Stack<Integer> stack = new Stack<>();

// 
stack.push(1);
stack.push(2);
stack.push(3);

// peek
System.out.println(stack.peek());  // 3

// pop
System.out.println(stack.pop());  // 3
System.out.println(stack.pop());  // 2
System.out.println(stack.pop());  // 1

// 是否为空
System.out.println(stack.isEmpty());  // true

LinkedList 类

LinkedList<Integer> stack = new LinkedList<>();

// push
stack.push(1);
stack.push(2);
stack.push(3);

// peek
System.out.println(stack.peek()); // 输出3

// pop
System.out.println(stack.pop()); // 输出3
System.out.println(stack.pop()); // 输出2
System.out.println(stack.pop()); // 输出1

// 判断栈是否为空
System.out.println(stack.isEmpty()); // 输出true

栈的应用

  • 计算表达式。通过将中缀表达式转换为后缀表达式,然后使用栈计算后缀表达式来得到正确的结果。
  • 括号匹配。使用栈来判断表达式中的括号是否匹配。
  • 逆序输出。可以使用栈来逆序输出一个字符串。

java 中的队列

代码随想录算法训练营第十天 | 栈和队列_第1张图片图来源于 Java数据结构10-死磕Java队列-基础篇

方法 作用 返回值
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞

Java常用队列

类名 是否阻塞 是否线程安全 是否有界 特点
LinkedList 非阻塞 线程安全 可选有界 基于链表
ArrayBlockingQueue 阻塞 线程安全 有界 基于数组的有界队列
LinkedBlockingQueue 阻塞 线程安全 可选有界 基于链表的无界队列
ConcurrentLinkedQueue 非阻塞 线程安全 无界 基于链表
PriorityBlockingQueue 阻塞 线程安全 无界 基于优先次序的无界队列
PriorityQueue 非阻塞 非线程安全 无界
SynchronousQueue 阻塞 线程安全 无数据队列 内部没有容器的队列 较特别
LinkedBlockingQueue 阻塞 线程安全 无界
DelayQueue 阻塞 线程安全 无界 基于时间优先级的队列
LinkedTrmsferQueue 阻塞 线程安全 无界 基于链表

你可能感兴趣的:(算法)