数据结构:栈与队列
1. 栈 (Stack)
栈是一种特殊的线性表,只允许在固定的一段进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出(LIFO, Last In First Out)的原则。
- 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
- 出栈:栈的删除操作叫做出栈。出数据在栈顶。
在 Java 中,Stack 类继承了 Vector 类,Vector 和 ArrayList 类似,都是动态的顺序表,不同的是 Vector 是线程安全的。
1.1 栈的基本操作
| 方法 | 功能 |
|---|---|
| Stack() | 构造一个空的栈 |
| E push(E e) | 将 e 入栈,并返回 e |
| E pop() | 将栈顶元素出栈并返回 |
| E peek() | 获取栈顶元素 |
| int size() | 获取栈中有效元素个数 |
| boolean isEmpty() | 检测栈是否为空 |
1.2 栈的模拟实现
1.2.1 构造方法
初始化栈结构。
1.2.2 扩容方法
当栈容量不足时进行扩容处理。
1.2.3 判断栈是否为空或是否满
检查栈的状态。
1.2.4 存储元素
将新元素存入栈顶。
1.2.5 删除元素
移除栈顶元素。
1.2.6 获取栈顶元素
查看但不移除栈顶元素。
1.3 逆波兰表达式
逆波兰表示法(Reverse Polish notation,RPN),是一种由波兰数学家扬·武卡谢维奇 1920 年引入的数学表达式形式。在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。
逆波兰表达式计算逻辑:
- 如果遇到操作数,则将操作数入栈;
- 如果遇到运算符,则将两个操作数出栈,其中先出栈的是右操作数,后出栈的是左操作数,使用运算符对两个操作数进行运算,将运算得到的新操作数入栈;
- 遍历完成后,栈内只有一个元素,该元素即为逆波兰表达式的值。
2. 队列
队列是只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列遵循先进先出(FIFO, First In First Out)原则。
- 入队列:进行插入操作的一端称为队尾(Tail/Rear)。
- 出队列:进行删除操作的一端称为队头(Head/Front)。
在 Java 中,Queue 是个接口,底层是通过链表实现的。
2.1 队列的基本操作
| 方法 | 功能 |
|---|---|
| boolean offer(E e) |


