堆栈与队列的区别及使用场景(python实现)

堆栈:先入后出,只能在一端进行操作

队列:先入先出,一端进入,一端出列

堆栈和队列的适用场景

堆栈:

  • 用于符号的匹配:在编译器的语法检查中,一个过程就是检查各种括号是否匹配,比如 ([]) ,这就是匹配的,而 {[}] 就不匹配了。
  • 用于计算代数式:如果我们要计算 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])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章