栈(Stack) 和 队列(Queue) 是两种基本的数据结构,各自具有不同的操作规则和应用场景。
栈(Stack)
- 操作规则:遵循“后进先出”(LIFO, Last In First Out)原则。
- 主要操作:
- Push:将元素压入栈中。
- Pop:从栈顶弹出元素。
- Peek/Top:查看栈顶元素但不弹出。
- IsEmpty:检查栈是否为空。
应用示例:
- 函数调用的管理(调用栈)。
- 浏览器的历史记录管理(回退操作)。
队列(Queue)
- 操作规则:遵循“先进先出”(FIFO, First In First Out)原则。
- 主要操作:
- Enqueue:将元素加入队列的尾部。
- Dequeue:从队列的头部移除元素。
- Front/Peek:查看队列的头部元素但不移除。
- IsEmpty:检查队列是否为空。
用队列实现栈
push(x: int) -> None:
将元素 x 加入 queue2。
将 queue1 中的所有元素移动到 queue2 中。
交换 queue1 和 queue2 的引用,使 queue1 始终保持栈的顺序。
pop() -> int:
从 queue1 中弹出并返回元素(这是栈顶元素)。
top() -> int:
返回 queue1 的前端元素(栈顶元素),但不弹出它。
empty() -> bool:
判断 queue1 是否为空来确定栈是否为空。
逆波兰表达式求值
处理操作数:直接推入栈中。
处理运算符:弹出栈顶的两个操作数,进行计算,然后将结果推入栈中。对于除法,int(a / b) 保证了向零截断的效果。
结果返回:栈中最后剩下的值就是最终结果。