[简述]数据结构-队列(c语言实现)

本文介绍队列数据结构的基本概念及其实现方法,包括队列的抽象数据类型定义、顺序存储结构和链式存储结构,并提供C语言具体实现代码。

[简述]数据结构-队列(c语言实现)

second60 20180422

1. 队列的定义

队列是仅允许在一端进行插入,别一端进行删除的线性表。

 

插入一端叫队尾rear,删除一端叫队首front

队列的特点是:先进先出。

 

2. 队列的抽象数类型定义

ADT Queue

{

数据对象:

D={ai | i<=i <= n,n>=0,ai ElemType类型}

数据关系:

R={<ai, ai+1> | ai,ai+1D}

基本运算:

InItQueue(&q):初始化队列

ClearQueue(&q):销毁队列

QueueEmpty(s):队列是否空

EnQueue(&q,e):入队

DeQueue(&q,&e):出队

}ADT Queue

 

3. 队列的顺序储存结构

typedef struct

{

ElemType data[MAXSIZE];

int front,rear;

}SqQueue;

 

队空的判断: q->rear == q->front

队满的判断: (q->rear+1) % MAXSIZE == q->front

这里有个坑,最大大小为MAXSIZE-1

 

算法代码如下,C语言实现,已编译通过:

#include "stdio.h"

#define MAXSIZE 6

typedef int ElemType;

typedef struct

{

ElemType data[MAXSIZE];

int      front, rear;

}SqQueue;

void InitQueue(SqQueue **q)

{

    *q = (SqQueue*)malloc(sizeof(SqQueue));

    (*q)->front = (*q)->rear = 0;

}

void ClearQueue(SqQueue **q)

{

    if(q != NULL && (*q) != NULL)

        free(*q);

}

int QueueEmpty(SqQueue *q)

{

    return (q->front == q->rear);

}

int EnQueue(SqQueue **q,ElemType e)

{

    if(((*q)->rear+1) % MAXSIZE == (*q)->front)

        return 0;

    (*q)->rear=((*q)->rear +1) %MAXSIZE;

    (*q)->data[(*q)->rear] = e;

    return 1;

}

int DeQueue(SqQueue **q, ElemType *e)

{

    if((*q)->front == (*q)->rear)

        return 0;

    (*q)->front = ((*q)->front+1) %MAXSIZE;

    *e = (*q)->data[(*q)->front];

    return 1;

}

int DispQueue(SqQueue *q)

{

    int start = q->front+1;

    int end   = (q->rear+1)%MAXSIZE;

    if(q->front == q->rear)

        return 0;

 

    for(; start != end;)

    {

        printf("%d ",q->data[start]);

        start = (start+1)%MAXSIZE;

    }

    printf("\n");

    return 1;

}

 

int main()

{

    int value = 0;

    SqQueue *q;

    InitQueue(&q);

    EnQueue(&q,12);

    EnQueue(&q,13);

    EnQueue(&q,14);

    EnQueue(&q,15);

    EnQueue(&q,16);

    EnQueue(&q,17);

    DispQueue(q);

    DeQueue(&q,&value);

    printf("DeQueue=%d\n",value);

    DispQueue(q);

    DeQueue(&q,&value);

    printf("DeQueue=%d\n",value);

    DispQueue(q);

    DeQueue(&q,&value);

    printf("DeQueue=%d\n",value);

    DispQueue(q);

    EnQueue(&q,18);

    DispQueue(q);

    EnQueue(&q,19);

    DispQueue(q);

    EnQueue(&q,20);

    DispQueue(q);

    getchar();

    return 1;

}

 

4. 队列的链式储存结构

队列的链式,头结点,只需保存两个指针,头结点指针和尾结点指针。

数据结点,包存数据和下一个结点指针。

 

数据类型定义

typedef struct qnode

{

ElemType  data;

struct qnode *next;

}QNode;

 

链队结点:

typedef strut

{

QNode *front;

QNode *rear;

}LiQueue;


算法实现,C语言,已自测通过:

#include "stdio.h"

#define MAXSIZE 6

typedef int ElemType;

typedef struct qnode

{

    ElemType data;

    struct qnode *next;

}QNode;

typedef struct

{

    QNode *front;

    QNode *rear;

}LiQueue;

void InitQueue(LiQueue **q)

{

    *q = (LiQueue*)malloc(sizeof(LiQueue));

    (*q)->front = (*q)->rear = NULL;

}

void ClearQueue(LiQueue **q)

{

    QNode *p = (*q)->front,*r;

    if(p!= NULL)

    {

        r = p->next;

        while(r!=NULL)

        {

            free(p);

            p=r;

            r = p->next;

        }

    }

    free(*q);

}

int QueueEmpty(LiQueue *q)

{

    if(q->rear == NULL)

        return 1;

    else

        return 0;

}

int EnQueue(LiQueue **q,ElemType e)

{

    QNode *s;

    s = (QNode*)malloc(sizeof(QNode));

    s->data = e;

    s->next = NULL;

    if((*q)->rear == NULL)

        (*q)->front = (*q)->rear = s;

    else

    {

        (*q)->rear->next = s;

        (*q)->rear = s;

    }

}

int DeQueue(LiQueue **q, ElemType *e)

{

    QNode *t;

    if((*q)->rear == NULL)

        return 0;

    t = (*q)->front;

    if((*q)->front == (*q)->rear)

        (*q)->front = (*q)->rear = NULL;

    else

        (*q)->front = (*q)->front->next;

    *e = t->data;

    free(t);

    return 1;

}

int DispQueue(LiQueue *q)

{

    QNode *p = q->front;

    if(q->rear == NULL)

        return 0;

    while(p!=NULL)

    {

        printf("%d ",p->data);

        p = p->next;

    }

    printf("\n");

    return 1;

}

int main()

{

    int value = 0;

    LiQueue *q;

    InitQueue(&q);

    EnQueue(&q,112);

    EnQueue(&q,113);

    EnQueue(&q,114);

    EnQueue(&q,115);

    EnQueue(&q,116);

    EnQueue(&q,117);

    DispQueue(q);

    DeQueue(&q,&value);

    printf("DeQueue=%d\n",value);

    DispQueue(q);

 

    DeQueue(&q,&value);

    printf("DeQueue=%d\n",value);

    DispQueue(q);

    DeQueue(&q,&value);

    printf("DeQueue=%d\n",value);

    DispQueue(q);

    EnQueue(&q,118);

    DispQueue(q);

    EnQueue(&q,119);

    DispQueue(q);

    EnQueue(&q,210);

    DispQueue(q);

    getchar();

    return 1;

}

5. 队列的运用

  队列的运用非常广泛,如消息队列,调度系统等

6. 总结

  队列和栈一样,都是用的很平常的数据结构,是数据结构的基础。很多系统的实现,都采用了队列的原理,特点是现在常用的消息队列系统。如:kafka, mq等。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值