数据结构教程(第四版)P82~84//环形队列

本文介绍了一种基于数组实现的循环队列,并通过具体的C++代码展示了如何初始化队列、插入元素、删除元素等基本操作。通过实例演示了循环队列在实际编程中的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include<malloc.h>
#define MaxSize 5
using namespace std;

typedef int ElemType;
typedef struct
{
        ElemType data[MaxSize];
        int front,rear;
}SqQueue;
void InitQueue(SqQueue *&q)
{
    q=(SqQueue *)malloc(sizeof(SqQueue));
    q->front=q->rear=0;
}
void DestroyQueue(SqQueue *&q)
{
    free(q);
}
bool enQueue(SqQueue *q,ElemType e)
{
    if((q->rear+1)%MaxSize==q->front)
        return false;
    q->rear=(q->rear+1)%MaxSize;
    q->data[q->rear]=e;
    return true;
}
bool deQueue(SqQueue *&q,ElemType &e)
{
    if(q->rear==q->front)
        return false;
    q->front=(q->front+1)%MaxSize;
    e=q->data[q->front];
    return true;
}
int   main()
{
    SqQueue *q;
    InitQueue(q);
    enQueue(q,1);
    enQueue(q,2);
    enQueue(q,3);
    enQueue(q,4);
    int a[5];
    for(int i=0;i<4;i++)
    deQueue(q,a[i]);
     for(i=0;i<4;i++)
    cout<<a[i]<<"   ";
    enQueue(q,5);
    enQueue(q,6);
    enQueue(q,7);
    enQueue(q,8);
    for(i=0;i<4;i++)
    deQueue(q,a[i]);
     for(i=0;i<4;i++)
    cout<<a[i]<<"   ";
    cout<<endl;
    return 0;
}

#include "sys.h" #include "usart.h" #if USER_RINGBUFF typedef struct { u16 Head; u16 Tail; u16 Lenght; u8 Ring_Buff[RINGBUFF_LEN]; }RingBuff_t; RingBuff_t ringBuff;//创建一个ringBuff的缓冲区 /** * @brief RingBuff_Init * @param void * @return void * @author 杰杰 * @date 2018 * @version v1.0 * @note 初始化环形缓冲区 */ void RingBuff_Init(void) { //初始化相关信息 ringBuff.Head = 0; ringBuff.Tail = 0; ringBuff.Lenght = 0; } /** * @brief Write_RingBuff * @param u8 data * @return FLASE:环形缓冲区已满,写入失败;TRUE:写入成功 * @author 杰杰 * @date 2018 * @version v1.0 * @note 往环形缓冲区写入u8类型的数据 */ u8 Write_RingBuff(u8 data) { if(ringBuff.Lenght >= RINGBUFF_LEN) //判断缓冲区是否已满 { return FLASE; } ringBuff.Ring_Buff[ringBuff.Tail]=data; // ringBuff.Tail++; ringBuff.Tail = (ringBuff.Tail+1)%RINGBUFF_LEN;//防止越界非法访问 ringBuff.Lenght++; return TRUE; } /** * @brief Read_RingBuff * @param u8 *rData,用于保存读取的数据 * @return FLASE:环形缓冲区没有数据,读取失败;TRUE:读取成功 * @author 杰杰 * @date 2018 * @version v1.0 * @note 从环形缓冲区读取一个u8类型的数据 */ u8 Read_RingBuff(u8 *rData) { if(ringBuff.Lenght == 0)//判断非空 { return FLASE; } *rData = ringBuff.Ring_Buff[ringBuff.Head];//先进先出FIFO,从缓冲区头出 // ringBuff.Head++; ringBuff.Head = (ringBuff.Head+1)%RINGBUFF_LEN;//防止越界非法访问 ringBuff.Lenght--; return TRUE; } /** * @brief Lenght_RingBuff * @param RingBuff_t buff * @return (buff.Head-buff.Tail+RINGBUFF_LEN)%RINGBUFF_LEN; * @author 杰杰 * @date 2018 * @version v1.0 * @note 静态内部调用函数(留出备用):求某一个buff数据的长度 */ //static u16 Lenght_RingBuff(RingBuff_t *buff) //{ // return (buff.Head-buff.Tail+RINGBUFF_LEN)%RINGBUFF_LEN; //} #endif ////////////////////////////////////////////////////////////////////////////////// //如果使用ucos,则包括下面的头文件即可. #if SYSTEM_SUPPORT_OS #include "includes.h" //ucos 使用 #endif ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,得用于其它任何用途 //ALIENTEK STM32开发板 //串口1初始化 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2012/8/18 //版本:V1.5 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 //All rights reserved //******************************************************************************** //V1.3修改说明 //支持适应同频率下的串口波特率. //加入了对printf的支持 //增加了串口接收命令功能. //修正了printf第一个字符丢失的bug //V1.4修改说明 //1,修改串口初始化IO的bug //2,修改了USART_RX_STA,使得串口最大接收字节数为214次方 //3,增加了USART_REC_LEN,用于定义串口最大允许接收的字节数(大于214次方) //4,修改了EN_USART1_RX的使能方式 //V1.5修改说明 //1,增加了对UCOSII的支持 ////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// //加入以下代码,支持printf函数,而需要选择use MicroLIB #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE { int handle; }; FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { while((USART1->SR&0X40)==0);//循环发送,直到发送完毕 USART1->DR = (u8) ch; return ch; } #endif /*使用microLib的方法*/ /* int fputc(int ch, FILE *f) { USART_SendData(USART1, (uint8_t) ch); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} return ch; } int GetKey (void) { while (!(USART1->SR & USART_FLAG_RXNE)); return ((int)(USART1->DR & 0x1FF)); } */ #if EN_USART1_RX //如果使能了接收 //串口1中断服务程序 //注意,读取USARTx->SR能避免莫名其妙的错误 u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节. //接收状态 //bit15, 接收完成标志 //bit14, 接收到0x0d //bit13~0, 接收到的有效字节数目 u16 USART_RX_STA=0; //接收状态标记 void uart_init(u32 bound){ //GPIO端口置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟 //USART1_TX GPIOA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9 //USART1_RX GPIOA.10初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10 //Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据定的参数初始化VIC寄存器 //USART 初始化置 USART_InitStructure.USART_BaudRate = bound;//串口波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1, &USART_InitStructure); //初始化串口1 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断 USART_Cmd(USART1, ENABLE); //使能串口1 } #if USER_RINGBUFF void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清楚标志位 Write_RingBuff(USART_ReceiveData(USART1)); //读取接收到的数据 } } #else void USART1_IRQHandler(void) //串口1中断服务程序 { u8 Res; #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS. OSIntEnter(); #endif if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾) { Res =USART_ReceiveData(USART1); //读取接收到的数据 if((USART_RX_STA&0x8000)==0)//接收未完成 { if(USART_RX_STA&0x4000)//接收到了0x0d { if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始 else USART_RX_STA|=0x8000; //接收完成了 } else //还没收到0X0D { if(Res==0x0d)USART_RX_STA|=0x4000; else { USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; USART_RX_STA++; if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收 } } } } #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS. OSIntExit(); #endif } #endif #endif 这段程序是怎么把数据存入环形缓冲区内
最新发布
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值