[简述]数据结构-队列(c语言实现)
second60 20180422
1. 队列的定义
队列是仅允许在一端进行插入,别一端进行删除的线性表。
插入一端叫队尾rear,删除一端叫队首front。
队列的特点是:先进先出。
2. 队列的抽象数类型定义
ADT Queue
{
数据对象:
D={ai | i<=i <= n,n>=0,ai ElemType类型}
数据关系:
R={<ai, ai+1> | ai,ai+1为D}
基本运算:
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等。
本文介绍队列数据结构的基本概念及其实现方法,包括队列的抽象数据类型定义、顺序存储结构和链式存储结构,并提供C语言具体实现代码。
1111

被折叠的 条评论
为什么被折叠?



