栈和队列定义及常用语法 LeetCode

一.栈 Stack

1.1 概念

  • 栈是一种线性数据结构,遵循先进后出 FILO(First In Last Out)
  • 只能在一端(栈顶)进行插入、删除

1.2 常用用法

常用操作:

  • 入栈:stack.push()
  • 出栈:stack.pop()
  • 查看栈顶元素:stack.peek()
  • 判空:stack.isEmpty()

注意:空栈的话pop/peek会抛异常,使用前isEmpty()

LinkedList实现栈

复制代码
Deque<Integer> stack = new LinkedList<>();
stack.push(10);  // 压入元素
stack.pop();     // 弹出元素

适用场景:适用于对栈操作的基本需求,支持在栈顶进行插入和删除

ArrayDeque实现栈(常用)

复制代码
ArrayDeque<Integer> stack = new ArrayDeque<>();
stack.push(10);  // 压入元素
stack.pop();     // 弹出元素

适用场景:相比较LinkedList,ArrayDeque的性能通常更优,适用于频繁操作栈顶的场景

二.队列 Queue

1.1 概念

  • 队列是一种线性数据结构,遵循先进先出 FIFO(First In First Out)
  • 在两端操作:队尾入队,队头出队

1.2 常用用法

常用用法:

  • 入队:queue.offer()
  • 出队:queue.poll() 空队列返回null
  • 查看队头元素:queue.peek() 空队列返回null
  • 判空:queue.isEmpty()

LinkedList实现队列:

复制代码
Queue<Integer> queue = new LinkedList<>();
queue.offer(10);  // 入队
queue.poll();     // 出队

适用场景:适合队列操作,可以灵活的进行队列的头尾插入和删除

ArrayDeque实现队列

复制代码
ArrayDeque<Integer> queue = new ArrayDeque<>();
queue.offer(10);  // 入队
queue.poll();     // 出队

适用场景:ArrayDeque性能更好,适合需要高效入队和出队的场景

三.双端队列

Deque是双端队列(Double-ended Queue)的简称,支持从两端插入和删除元素。Deque既可以作为栈使用,也可以作为队列使用。

LinkedList实现双端队列:

复制代码
Deque<Integer> deque = new LinkedList<>();
deque.addFirst(10);  // 在头部插入元素
deque.addLast(20);   // 在尾部插入元素
deque.removeFirst(); // 从头部移除元素
deque.removeLast();  // 从尾部移除元素

使用场景:需要从两端进行插入和删除操作时使用,如实现双向队列、回退栈等

ArrayDeque实现双端队列

复制代码
ArrayDeque<Integer> deque = new ArrayDeque<>();
deque.addFirst(10);  // 在头部插入元素
deque.addLast(20);   // 在尾部插入元素
deque.removeFirst(); // 从头部移除元素
deque.removeLast();  // 从尾部移除元素

适用场景:适用需要从两端快速插入和删除元素的场景,性能更好,适用于高效的双端队列操作

代码随想录LeetCode题目:

1.删除字符串中的所有相邻重复项

1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)

2.逆波兰表达式求值

逆波兰表达式,也就是后续表达式(经典)

  • 如果遇到操作数,则将操作数入栈;
  • 如果遇到运算符,则将两个操作数出栈,其中先出栈的是右操作数,后出栈的是左操作数,使用运算符对两个操作数进行运算,将运算得到的新操作数入栈;
  • 遍历完成后,栈内只有一个元素,该元素即为逆波兰表达式的值。

150. 逆波兰表达式求值 - 力扣(LeetCode)

3.有效括号匹配 经典

20. 有效的括号 | 代码随想录

相关推荐
be or not to be2 小时前
JavaScript 对象与原型
开发语言·javascript·ecmascript
0x532 小时前
JAVA|智能无人机平台(二)
java·开发语言·无人机
JH30732 小时前
SpringBoot自定义启动banner:给项目加个专属“开机画面”
java·spring boot·后端
嵌入小生0072 小时前
基于Linux系统下的C语言程序错误及常见内存问题调试方法教程(嵌入式-Linux-C语言)
linux·c语言·开发语言·嵌入式·小白·内存管理调试·程序错误调试
假女吖☌2 小时前
限流算法-redis实现与java实现
java·redis·算法
小温冲冲2 小时前
QPixmap 详解:Qt 中的高效图像处理类
开发语言·图像处理·qt
lixin5565563 小时前
基于迁移学习的图像风格增强器
java·人工智能·pytorch·python·深度学习·语言模型
面汤放盐3 小时前
企业权限--系统性方案探究
java·开发语言
what丶k3 小时前
深度解析Redis LRU与LFU算法:区别、实现与选型
java·redis·后端·缓存