ds_02_queue

本文介绍了使用C语言编写的队列数据结构,包含队列的初始化、终结化、判断队列满和空以及入队和出队操作的实现。
摘要由CSDN通过智能技术生成

队列  先进先出  FIFO

queue.h

//queue.h 队列头文件
#ifndef __QUEUE_H_
#define __QUEUE_H_
#include<stdio.h>
#include<stdlib.h>// malloc()
//定义队列
typedef struct queue{
    int* arr;//存储区的首地址
    int cap;//队列的容量,能装多少
    int size;//有效元素的个数,已经装了多少
    int front;//要出队的元素的下标
    int rear;//要入队的元素的下标
}queue_t;

//队列的操作
//队列的初始化 queue_t queue;
void queue_init(queue_t* q,int cap);
//队列的终结化
void queue_deinit(queue_t* q);
//队列判满 返回1 返回0
int queue_full(queue_t* q);
//队列判空 返回1 返回0 
int queue_empty(queue_t* q);
//入队
void queue_push(queue_t* q,int data);
//出队
int queue_pop(queue_t* q);

#endif //__QUEUE_H_

queue.c

//queue.c  队列的实现
#include"queue.h"

//队列的初始化
//queue_t queue;
//queue_init(&queue,5);
void queue_init(queue_t* q,int cap){
    //分配存储区
    q->arr = malloc(sizeof(int) * cap);
    q->cap = cap;//容量
    q->size = 0;//元素个数
    q->front = 0;//取的下标 
    q->rear = 0;//存的下表
}
//队列的终结化
void queue_deinit(queue_t* q){
    //释放存储区
    free(q->arr);
    q->arr = NULL;
    q->cap = 0;
    q->size = 0;
    q->front = 0;
    q->rear = 0;
}

//队列判满
int queue_full(queue_t* q){
    if(q->cap == q->size){
        return 1;
    }else{
        return 0;
    }
}
//队列判空
int queue_empty(queue_t* q){
    if(q->size == 0){
        return 1;
    }else{
        return 0;
    }
}
//入队
void queue_push(queue_t* q,int data){
    //如果rear已经超过了最后的存储位置,应该归0,从头开始
    if(q->rear == q->cap){
        q->rear = 0;
    }
    //存入数据
    q->arr[q->rear] = data;
    //rear后移,记录下一个位置
    q->rear++;
    //计数加一
    q->size++;
}
//出队
int queue_pop(queue_t* q){
    //如果front已经超过了最后的位置,则归0
    if(q->front == q->cap){
        q->front = 0;
    }
    //取出数据
    int data = q->arr[q->front];
    //front后移,记录下一个位置
    q->front++;
    //计数减一
    q->size--;
    return data;
}

mian.c

//main.c  队列的测试
#include"queue.h"

int main(void){
    //定义队列
    queue_t queue;
    //初始化
    queue_init(&queue,5);
    //入队
    int data = 1;
    //循环,直到队列满为止
    while(queue_full(&queue) != 1){
        queue_push(&queue,data++);
    }
    //出队
    while(1){
        //如果队列空,则结束循环
        if(queue_empty(&queue) == 1){
            break;
        }
        printf("%d\n",queue_pop(&queue));
    }

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值