Java复习Day25
数据结构基础概念
1. 栈 (Stack)
栈是一种特殊的线性表,其元素插入和删除操作只能在同一端进行。允许操作的一端称为栈顶(TOP),另一端固定不动称为栈底(BOTTOM)。栈遵循后进先出(LIFO)原则,即最先入栈的元素位于栈底,最后入栈的元素位于栈顶;出栈时顺序相反。
术语说明:
- 压栈(Push):插入元素的操作,也称进栈/入栈
- 出栈(Pop):删除元素的操作,也称弹栈
Java中的Stack类继承自Vector,常用方法包括:
push(E)
:压栈操作pop()
:获取并移除栈顶元素peek()
:获取栈顶元素但不移除empty()/isEmpty()
:判断栈是否为空search(Object)
:查找元素位置,未找到返回-1
2. 递归
2.1 简介
递归是一种通过将问题分解为同类子问题来求解的方法,表现为方法自我调用。类比查词典:当遇到不理解的词时查阅,若解释中仍有不理解的词则继续查阅,直到获得明确解释,再回溯理解最初的问题。
2.2 特征
- 终止条件:必须有明确的递归出口
- 自身调用:子问题与原问题求解方法一致
2.3 解题思路
- 明确方法功能
- 确定递归出口
- 建立递推关系式
2.4 应用场景
- 阶乘问题
- 二叉树深度计算
- 斐波那契数列(0,1,1,2,3,5,8,13...)
- 快速排序
- 文件遍历
- XML文件解析
缺点:
- 内存消耗较大
- 若无终止条件或递归过深,易导致栈溢出(StackOverflowError)
3. 队列
3.1 简介
队列是操作受限的线性表,只允许在表的一端(队尾Rear)插入,另一端(队头Front)删除。其特性为先进先出(FIFO)。
分类方式:
- 按方向:单向队列、双向队列
- 按阻塞情况:阻塞队列、非阻塞队列
- 按容量限制:有界队列、无界队列
3.2 Queue接口
继承自Collection,提供两种形式的操作:
- 失败时抛出异常
- 失败时返回null/false
3.3 Deque接口
双向队列,继承自Queue(Double-end queue),支持在两端进行插入、删除和获取操作,可实现FIFO或LIFO。
使用建议:
- 推荐使用Deque而非Stack实现栈结构
- 原因:
- Deque是接口,遵循面向接口编程原则
- Stack继承自Vector,使用synchronized实现线程安全