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()