3. 栈和队列
队列和栈是两种数据结构,其内部都是按照固定顺序来存放变量的,二者的区别在于对数据的存取顺序:
队列是一种先进先出(First-In-First-Out,Fifo)的数据结构。
栈是,最后存入的数据最先取出,即“后进先出”。
3.1. list 实现队列
使用 list 列表模拟队列功能的实现方法是,定义一个 list 变量,存入数据时使用
insert()方法,设置其第一个参 数为 0,即表示每次都从最前面插入数据;读取数据时,使用pop()方法,即将队列的最后一个元素弹出。 如此 list 列表中数据的存取顺序就符合 先进先出 的特点。
#1.先定义一个空列表(当做队列使用)
queue = []
#2.入栈(向列表中插入元素) queue.insert()
queue.insert(0,"Tom")
queue.insert(0,"Aim")
queue.insert(0,"Mike")
print(queue) #查看列表(也就是我们的队列)
#3.出栈 queue.pop()
print("第一个出栈:",queue.pop())
print("第二个出栈:",queue.pop())
print("第三个出栈:",queue.pop())
3.2. list 实现栈
使用 list 列表模拟栈功能的实现方法是,使用
append()方法存入数据;使用pop()方法读取数据。 append() 方法向 list 中存入数据时,每次都在最后面添加数据,这和前面程序中的 insert() 方法正好相反。 如此 list 列表中数据的存取顺序就符合 后进先出 的特点。
#1.先定义一个空列表(当做栈使用)
stack = []
#2.入栈
stack.append("Tom")
stack.append("Aim")
stack.append("Mike")
print(stack) #打印当前栈元素
#3.出栈
print("第一个出栈:",stack.pop())
print("第二个出栈:",stack.pop())
print("第三个出栈:",stack.pop())
3.3. AOI机台数据处理机制
AOI机台数据处理方法就可以借鉴 list 实现栈 的方法。
在串口或者网口的接收回调中做存入数据的操作。
在主程序while循环里 循环读取数据
from sharp_uart import *
import time
###此例程协议 以\r\n(0D 0A)为结束符
############################### 此例程以串口接收为例, 网口的AOI也是类似 #####################################################
queue=[] # 创建一个列表作为接收数据缓存区
AOI_Parse_OK = 0 # 解析数据成功标志位
AOI_Data = '' # 解析成功后的数据缓存区
def read_test(data,data_len): # 接收回调函数应尽可能的少程序,只存数据不取数据
if data_len != 0: # 当数据长度不为0时才开始接收数据
queue.append(data[0:data_len]) # 取出接收到的数据并存在接收数据缓存区里
def Parse_Data():
global AOI_Parse_OK
global AOI_Data
queue_buf = ''
if AOI_Parse_OK == 0:
if len(queue)> 0:
queue_buf += (queue.pop(0)).decode() # 从接收缓存区里取出数据 并转为字符串
length = queue_buf.find('\r\n') # 查找换行 结束字符
if length >=0: # 如果找到换行 结束字符
AOI_Data = queue_buf[0:length] # 取出解析的数据
queue_buf='' # 丢掉临时缓存的AOI数据,及换行符
AOI_Parse_OK = 1
return 0
elif AOI_Parse_OK == 1:
if AOI_Data == 'start':
print('start')
elif AOI_Data == 'stop':
print('stop')
elif AOI_Data == "frame":
print('frame')
elif AOI_Data == "sleep in":
print('sleep in')
AOI_Data = '' # 清除解析的数据
AOI_Parse_OK = 0 # 置零数据成功标志位 并重新解析数据
comDriver = SHARP_uart_init(port = 7,baudrate = 115200, bits=8, parity=None, stop=1,read_buf_len = 128)
comDriver.dev_single(read_test) # 注册接收回调
while True:
time.sleep(0.01)
Parse_Data()