嵌入式第二十八篇——数据结构——队列

一、基本概念

队列是一种先进先出的线性数据结构,元素从队尾插入,从队头删除。队列的操作主要包括入队和出队

二、队列的实现方式

队列可以通过顺序表或链表实现。顺序表实现的队列需要处理循环队列的情况以避免空间浪费,链表实现的队列则更灵活。

1、顺序表实现循环队列
复制代码
typedef int DATATYPE;

typedef struct queue {
DATATYPE *ptr;//动态分配的队列存储空间
int tlen;//队列总容量
int head;//队头指针
int tail;//队尾指针
}SeqQueue;//队列结构体定义

int DestroySeqQueue(SeqQueue *queue);//销毁队列
DATATYPE QuitSeqQueue(SeqQueue *queue);//出队
int EnterSeqQueue(SeqQueue *queue, DATATYPE data);//入队
int IsEmptySeqQueue(SeqQueue *queue);//队是否为空
int IsFullSeqQueue(SeqQueue *queue);//队是否为满
SeqQueue *CreateSeqQueue(int len);//创建指定容量的队

该代码实现了一循环顺序队列,通过头尾指针(head和tail)来管理队列操作。当head和tail相等时队列为空当(tail+1)%tlen等于head时队列为满。这种实现方式可以高效利用数组空间,避免假溢出问题。

2、链表实现队列
c 复制代码
// 定义人员信息结构体
typedef struct person {
    char name[32];  // 姓名,最大32字符
    char sex;       // 性别
    int age;        // 年龄
    int score;      // 分数
} DATATYPE;         // 数据类型别名

// 定义队列节点结构体
typedef struct quenode {
    DATATYPE data;          // 存储数据
    struct quenode *next;   // 指向下一个节点的指针
} LinkQueNode;              // 链式队列节点类型别名

// 定义队列结构体
typedef struct {
    LinkQueNode *head;  // 队首指针
    LinkQueNode *tail;  // 队尾指针
    int clen;           // 当前队列长度
} LinkQue;              // 链式队列类型别名
c 复制代码
// 创建空链式队列
LinkQue * CreateLinkQue();

// 入队操作:将新节点添加到队尾
int EnterLinkQue(LinkQue *lq, DATATYPE* newnode);

// 出队操作:删除队首节点
int QuitLinkQue(LinkQue *lq);

// 获取队首元素(不删除)
DATATYPE* GetHeadLinkQue(LinkQue *lq);

// 获取队列当前长度
int GetSizeLinkQue(LinkQue *lq);

// 判断队列是否为空
int IsEmptyLinkQue(LinkQue *lq);

// 销毁队列
int DestroyLinkQue(LinkQue *lq);
相关推荐
刘马想放假8 小时前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
05Kevin9 小时前
lk每日冒险题--数据结构6.27
算法
To_OC20 小时前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安1 天前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者1 天前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
北域码匠1 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
kisshyshy1 天前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范