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

C语言——数组实现循环队列,类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 
#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;
}

C语言——数组实现循环队列,类C++_第1张图片

你可能感兴趣的:(C语言之旅,c语言,c++,开发语言)