堆栈与队列的区别及使用场景(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])
数组、队列堆栈是常见的数据结构,在Python也有相应的实现。 1. 数组:数组是一种线性数据结构,可以存储多个元素,这些元素可以是任意类型的。在Python,可以使用列表(list)来实现数组。列表可以通过索引访问元素,也可以进行增删改查等操作。数组的特点是元素的访问速度很快,但插入和删除操作的效率较低。 2. 队列队列是一种先进先出(FIFO)的数据结构,只能在一端进行插入操作(入队),在另一端进行删除操作(出队)。在Python,可以使用collections模块的deque来实现队列。deque提供了popleft()方法用于出队操作,append()方法用于入队操作。 3. 堆栈堆栈是一种后进先出(LIFO)的数据结构,只能在一端进行插入和删除操作。在Python,可以使用列表(list)来实现堆栈。列表的append()方法用于入栈操作,pop()方法用于出栈操作。 使用场景: - 数组适用于需要频繁访问元素的情况,比如存储一组数据并进行遍历、查找等操作。 - 队列适用于需要按照先进先出顺序处理元素的情况,比如任务调度、消息传递等。 - 堆栈适用于需要按照后进先出顺序处理元素的情况,比如函数调用栈、表达式求值等。 总结: 数组、队列堆栈都是常用的数据结构,具有不同的特点和适用场景。在Python,可以使用列表(list)来实现这些数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值