堆栈:先入后出,只能在一端进行操作
队列:先入先出,一端进入,一端出列
※ 堆栈和队列的适用场景
堆栈:
- 用于符号的匹配:在编译器的语法检查中,一个过程就是检查各种括号是否匹配,比如 ([]) ,这就是匹配的,而 {[}] 就不匹配了。
- 用于计算代数式:如果我们要计算 6 + 4 * 8 ,要考虑到优先级的问题;先要把代数式构造成 6 4 8 * + 的形式;逐个读取数据,当读到数字时,把数字入栈;读到运算符时,弹出栈中的两个元素进行运算并把结果压入栈中;
- 构造表达式:比如一个正常的代数式(叫他infix), a + b * c + ( d * e + f ) * g , 转化成表达式 a b c * + d e * f + g * +, 这个表达式我们叫他 postfix。(先规定优先级,加减的优先级最低,左括号优先级最高)
- 用于函数调用:因为CPU一次只能执行一个命令,而寄存器也是公用的,当前函数 current() 在运行时,数据储存在寄存器中,如果要调用另外一个函数 target(),而target() 也要求使用寄存器,为了防止数据丢失并且在执行完 target()。能够返回到 current() 继续执行, 这时候就要把当前函数的重要数据储存起来,压入内存中的栈中( 包括变量的值和函数地址 )。这样target()函数就可以无所顾忌的使用寄存器了。target() 函数执行结束就取栈顶的返回地址继续执行 current()。
队列:
- 打印机:当多个任务分配给打印机时,为了防止冲突,创建一个队列,把任务入队,按先入先出的原则处理任务;
- 远程服务器:当多个用户要访问远程服务端的文件时,也用到队列,满足先来先服务的原则;
- 队列理论:用来计算 预测用户在队中的等待时间,队的长度等等问题;
一、使用列表实现堆栈和队列
(1)堆栈:
letters = []
# Let's push some letters into our list
letters.append('c')
letters.append('a')
letters.append('t')
letters.append('g')
# Now let's pop letters, we should get 'g'
last_item = letters.pop()
print(last_item)
# If we pop again we'll get 't'
last_item = letters.pop()
print(last_item)
# 'c' and 'a' remain
print(letters) # ['c', 'a']
输出:
g
t
['c', 'a']
(2)队列:
fruits = []
# Let's enqueue some fruits into our list
fruits.append('banana')
fruits.append('grapes')
fruits.append('mango')
fruits.append('orange')
# Now let's dequeue our fruits, we should get 'banana'
first_item = fruits.pop(0)
print(first_item)
# If we dequeue again we'll get 'grapes'
first_item = fruits.pop(0)
print(first_item)
# 'mango' and 'orange' remain
print(fruits) # ['mango', 'orange']
输出:
banana
grapes
['mango', 'orange']
二、使用Deque库的堆栈和队列
from collections import deque
# you can initialize a deque with a list
numbers = deque()
# Use append like before to add elements
numbers.append(99)
numbers.append(15)
numbers.append(82)
numbers.append(50)
numbers.append(47)
# You can pop like a stack
last_item = numbers.pop()
print(last_item) # 47
print(numbers) # deque([99, 15, 82, 50])
# You can dequeue like a queue
first_item = numbers.popleft()
print(first_item) # 99
print(numbers) # deque([15, 82, 50])
输出:
47
deque([99, 15, 82, 50])
99
deque([15, 82, 50])