C语言——数组实现循环队列,类C++

C语言——数组实现循环队列,类C++

实现思路

数据进入只操作队列尾部,离开队列只操作队列头部,循环可以使用取余的操作来实现。
使用函数指针实现面向对象的思想。

头文件

对外提供接口,提供使用方法,包含一个测试函数。

#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED

#define MAX_LEN 50

typedef int ElemType;
typedef struct QUEUE
{
    int front;
    int rear;
    int length;
    ElemType data[MAX_LEN];

    int (*full)(struct QUEUE *Q);
    int (*empty)(struct QUEUE *Q);
    int (*push)(struct QUEUE *Q,ElemType elem);
    int (*pop)(struct QUEUE *Q,ElemType *elem);
}QUEUE_T;

void queue_init(QUEUE_T *Q);
int queue_test();

#endif // QUEUE_H_INCLUDED

C文件

#include <stdio.h>
#include "queue.h"

static int is_full(QUEUE_T *Q);
static int is_empty(QUEUE_T *Q);
static int queue_enter(QUEUE_T *Q,ElemType elem);
static int queue_leave(QUEUE_T *Q,ElemType *elem);

void queue_init(QUEUE_T *Q)
{
    Q->front=0;
    Q->rear=0;
    Q->length=0;

    Q->full=is_full;
    Q->empty=is_empty;
    Q->push=queue_enter;
    Q->pop=queue_leave;
}

int is_full(QUEUE_T *Q)
{
    if(Q->front ==(Q->rear+1)%MAX_LEN)
        return 1;
    else
        return 0;
}

int is_empty(QUEUE_T *Q)
{
    if(Q->front==Q->rear)
        return 1;
    else
        return 0;
}

int queue_enter(QUEUE_T *Q,ElemType elem)
{
    if(is_full(Q))
        return 0;
    Q->data[Q->rear]=elem;
    Q->length++;
    Q->rear=(Q->rear+1)%MAX_LEN;
    return 1;
}

int queue_leave(QUEUE_T *Q,ElemType *elem)
{
    if(is_empty(Q))
        return 0;
    *elem=Q->data[Q->front];
    Q->length--;
    Q->front=(Q->front+1)%MAX_LEN;
    return 0;
}


int queue_test()
{
    QUEUE_T q;
    queue_init(&q);
    int i;
    for(i=0;i<20;i++)
    {
        q.push(&q,i);
    }
    for(i=0;i<20;i++)
    {
        int val;
        q.pop(&q,&val);
        printf("%d\n",val);
    }
    return 0;
}

测试

#include "queue.h"

int main()
{
    queue_test();
    return 0;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值