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

发布时间:2024年01月21日

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 中的队列

在这里插入图片描述图来源于 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阻塞线程安全无界基于链表
文章来源:https://blog.csdn.net/SUburbuia/article/details/135707039
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。