当前位置: 首页 > article >正文

C语言数据结构:队列的操作实现

队列是一种常见的数据结构,遵循先进先出(FIFO)原则,即最先进入的元素最先被移除。它类似于现实生活中的排队,先到的人先接受服务。

主要操作

  1. 入队(Enqueue):将元素添加到队列的末尾。

  2. 出队(Dequeue):移除并返回队列前端的元素。

  3. 查看队首(Peek/Front):返回队列前端的元素,但不移除。

  4. 判空(IsEmpty):检查队列是否为空。

  5. 获取大小(Size):返回队列中元素的数量。

实现方式

  1. 数组实现:使用数组存储元素,需处理数组大小限制。

  2. 链表实现:使用链表动态调整大小,避免数组大小问题。

应用场景

  • 任务调度:操作系统中的任务调度。

  • 数据缓冲:网络数据包的缓冲。

  • 广度优先搜索(BFS):用于遍历图或树结构。

#include <stdio.h>
#include <stdlib.h>
#define Max_Size 20
typedef int Elemtype;

typedef struct Queue
{
    Elemtype Data[Max_Size];
    int front;
    int rear;
} Queue;
void Q_Init(Queue *q);              // 队列初始化
int isEmpty(Queue *q);              // 判断队列是否为空
Elemtype delQueue(Queue *q);        // 出队
int in_Queue(Queue *q, Elemtype e); // 入队
int fullQueue(Queue *q);            // 判断是否真的满了
void showQueue(Queue *q);           // 遍历队列
int queueSize(Queue *q);            // 得到队列里元素数量
int getHead(Queue *Q,Elemtype *e);
int main(int argc, char const *argv[])
{
    Queue *q = malloc(sizeof(Queue));
    Q_Init(q);
    in_Queue(q, 1);
    in_Queue(q, 2);
    in_Queue(q, 3);
    
    // printf("%d",q->Data[2]);
    showQueue(q);
    int size=0;
    size = queueSize(q);
    printf("%d",size);
    return 0;
}
void Q_Init(Queue *q)
{
    q->front = 0;//队头下标初始化
    q->rear = 0;//队尾下标初始化
}
int isEmpty(Queue *q)
{
    if (q->front == q->rear)//队头与队尾下标相同时为空
    {
        printf("队列为空\n");
        return 1;
    }
    else
    {
        return 0;
    }
}
Elemtype delQueue(Queue *q)
{
    if (q->front == q->rear)
    {
        printf("队列为空\n");
        return 1;
    }
    Elemtype e;//临时变量
    e = q->Data[q->front];//临时变量承接删除元素
    q->front++;//队头后移
    return e;//返回删除元素
}
int in_Queue(Queue *q, Elemtype e)
{
    if (q->rear >= Max_Size)//检查是否对满
    {
        if (!fullQueue(q))
        {
            printf("经FULL函数检测已满\n");
        }
        return 1;
    }

    q->Data[q->rear] = e;//队尾处新元素赋值
    q->rear++;//队尾后移
    return 0;
}
int fullQueue(Queue *q)
{
    int step = 0;
    if (q->front > 0)//队头不为零,则是假溢出
    {
        step = q->front;//队头后移次数
        for (int i = q->front; i < q->rear; i++)//将队列内所有元素前移 step 步
        {
            q->Data[i - step] = q->Data[i];
        }
        q->front = 0;//队头更新
        q->rear = q->rear - step;//队尾更新
    }
    else
    {
        //printf("经FULL函数检测已满\n");
        return 0;
    }
}
void showQueue(Queue *q)
{
    printf("---------------\n");
    for (int i = q->front; i < q->rear; i++)//循环从队头打印到队尾前一个元素
    {
        printf("%d  ",q->Data[i]);
    }
    printf("\n");
    printf("---------------\n");
}
int getHead(Queue *Q,Elemtype *e)
{
    if (Q->front == Q->rear)
    {
        printf("队列为空\n");
        return 1;
    }
    *e=Q->Data[Q->front];//指针指向队头
    return 0;
}
int queueSize(Queue *q)
{
    if (isEmpty(q))
    {
        return 0;
    }
    int temp=0;
    temp=q->front;
    int t=0;
    while (temp!=q->rear)//从队头开始自增直到队尾
    {
        temp++;
        t++;
    }
    return t;
    
}


http://www.kler.cn/a/619523.html

相关文章:

  • 蓝桥杯单片机刷题——E2PROM记录开机次数
  • 08-项目中不可控的任务如何安排和验收
  • DeepSeek-V3-0324对比OpenAI GPT-4o和Gemini 2.5 Pro
  • Python 实战:手语翻译系统——从视频到文本的智能转换
  • 算法-广度优先搜索
  • UE4学习笔记 FPS游戏制作26 UE中的UI
  • Angular项目改端口号
  • 简单介绍一下Unity中的material和sharedMaterial
  • Javaweb后端登录认证 登录校验 过滤器 filter令牌校验,执行流程,拦截路径
  • Linux网络基础知识
  • 人工智能入门(2)
  • LeetCode hot 100 每日一题(16)——240. 搜索二维矩阵 II
  • 基于SpringBoot + Vue 的餐厅点餐管理系统
  • 涨薪技术|使用Dockerfile创建镜像
  • 网络华为HCIA+HCIP ip-prefix,route-policy
  • MySQL--权限管理
  • Postman 7.3.5 旧版下载指南(Win64)及注意事项
  • [ CTFshow ] Java web279-web281
  • 【Git 常用指令速查表】
  • 科技推动下,楼宇自控技术在建筑节能领域如何大放异彩