【C语言数据结构】07.循环队列

本文详细介绍了如何使用C语言通过结构体指针实现循环队列,包括队列的初始化、入队、出队操作,以及如何判断队列状态并进行遍历。通过实例演示了如何创建和操作循环队列,适合初学者理解数据结构基本概念。

前言

  • 本节主要进行C语言数据结构循环队列的学习。

在这里插入图片描述

“性痴则志凝,故书痴者文必工,艺痴者技必良。” ——《聊斋志异·阿宝》



1.队列的介绍

  • 循环队列是一种顺序表示的队列,用一组地址连续的存储单元依次存放从队头到队尾的元素。
  • 由于队列中队头和队尾的位置是动态变化的,要附设两个指针 front 和 rear ,分别指示队头元素和队尾元素在数组中的位置。
  • 初始化队列时,令 front = rear = 0。
    在这里插入图片描述
  • 此节,不使用链表,直接使用数组实现队列。

2.结构体指针实现队列

  • 实现内容与前章相同,1.初始化队列;2.入队;3.出队;4.遍历队列。
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

#define MAXSIZE 5
//因为如果存满MAXSIZE个数,而faont与rear相等时,无法区分队列是满还是空;因为使用牺牲rear指向的一个元素,如MAXSIZE==5,则只存4个:当faont与rear+1相等时即认为满,不再往rear里写入;faont与rear相等时为空
typedef struct Node//定义数据结构
{
    int faont;
    int rear;
    int data[MAXSIZE];
}Node;

Node* initList()//初始化头节点
{
    Node* Queue=(Node*)malloc(sizeof(Node));
    Queue->faont=Queue->rear=0;
    return Queue;
}

bool isFull(Node* Queue)//检查队列是否为满
{
    if((Queue->rear+1)%MAXSIZE==Queue->faont)//加满5个则重新计数
        return 1;
    else 
        return 0;
}

bool isEmpty(Node* Queue)//检查队列是否为空
{
    if(Queue->rear==Queue->faont)
        return 1;
    else 
        return 0;
}

bool enQueue(Node* Queue,int data)//入队
{
    if(isFull(Queue))//入队前判是否为满
        return 0;
    else
    {
        Queue->data[Queue->rear]=data;
        Queue->rear=(Queue->rear+1)%MAXSIZE;
        return 1;
    }
}

int deQueue(Node* Queue)//出队
{
    if(isEmpty(Queue))//出队前判是否为空
        return 0;
    else
    {
        int data=Queue->data[Queue->faont];
        Queue->faont=(Queue->faont+1)%MAXSIZE;
        return data;
    }
}

void printList(Node* Queue)//遍历操作
{
    int count=(Queue->rear - Queue->faont+MAXSIZE)%MAXSIZE;
    int index=Queue->faont;
    for (int i = 0; i < count; i++)
    {
        printf("%d->",Queue->data[index]);
        index=(index+1)%MAXSIZE;
    }
    printf("NULL\n");
}

int main()
{
    Node* Queue= initList();//初始化头节点,创捷队列
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    enQueue(Queue,1);
    printList(Queue);
    enQueue(Queue,2);
    printList(Queue);
    enQueue(Queue,3);
    printList(Queue);
    enQueue(Queue,4);
    printList(Queue);
    enQueue(Queue,5);
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    printf("%d\n",deQueue(Queue));
    printList(Queue);
    system("pause");
}

在这里插入图片描述

参考资料:
链接: UP从0到1带你手撕数据结构全集(C语言版)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不僈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值