队列的知识

来源:互联网 发布:ubuntu gcc下载 编辑:程序博客网 时间:2024/06/06 15:16

1、定义

          只允许在表的一端进行插入(队尾),表的另一端进行删除(队头)的线性表

2、队列的存储结构

(1)顺序

结构定义:

    由一维数组,和队尾指针(队尾元素的当前位置),队头指针(队头元素的当前位置的前一个位置)

#define maxsize   100+1

typedef int elemtype;
typedef struct
{
elemtype elem[maxsize];
int front, rear;
}cqueuetp;

为解决假溢出现象,采用循环队列,方法是取余运算

入队操作:

   sq.rear=(sq.rear+1)%maxsize;

   sq.elem[sq.rear]=x;

出队操作:

   sq.front=(sq.front+1)%maxsize


队列的初始化操作:

void InitQueue(cqueuetp *sq)
{
sq->front = 0;
sq->rear = 0;

}

判断队列是否为空:

int QueueEmpty(cqueuetp *sq)
{
if (sq->front == sq->rear)
return 1;                //返回真值
return 0;
}

求队列长度:

int Size(cqueuetp *sq)
{
return ((maxsize + sq->rear - sq->front) % maxsize);  //考虑sq->rear-sq->front<0的情况
}

读取队头元素:

elemtype Head(cqueuetp *sq)
{
if (sq->front == sq->rear)
return NULL;
else
return (sq->elem[(sq->front + 1) % maxsize]); //返回队头元素值
}

入队操作:

void EnQueue(cqueuetp *sq, elemtype x)
{
if ((sq->rear + 1) % maxsize == sq->front)
printf("Overlow");
else
{
sq->rear = (sq->rear + 1) % maxsize;          //插入队尾元素
sq->elem[sq->rear] = x; 

}
}

出队操作:

elemtype DelQueue(cqueuetp *sq)
{
if (sq->rear == sq->front)
return NULL;
else
{
sq->front = (sq->front + 1) % maxsize;
return (sq->elem[sq->front]);

}
}

(2)链式

结构定义:

#define maxsize   100+1

typedef int elemtype;
typedef struct NODETYPE
{
elemtype data;
struct NODETYPE *next;
}nodetype;

typedef struct
{
nodetype *front;
nodetype *rear;
}lqueuetp;


队列初始化:

void InitQueue(lqueuetp *lq)
{
lq->front = (nodetype *)malloc(sizeof(nodetype));  //设置空队列lq

lq->front->next = NULL;

lq->front = lq->rear;
}

判断队空:

int QueueEmpty(lqueuetp *lq)
{
if (lq->front == lq->rear)
return 1;
return 0;
}

求队列长度:

int Size(lqueuetp *lq)
{
int i = 0;
nodetype *p = lq->front->next;

while (p)
{
i++;
p = p->next;
}

return i;
}

读取头元素值:

elemtype Head(lqueuetp *lq)
{
if (lq->front == lq->rear)
return NULL;
else
{
return lq->front->next->data;
}
}

入队操作:

void EnQueue(lqueuetp *lq,elemtype x)
{
nodetype *s;
s = (nodetype *)malloc(sizeof(nodetype));
s->data = x;

s->next = NULL;
lq->rear->next = s;
lq->rear = s;

}

出队操作:

elemtype DelQueue(lqueuetp *lq)
{
elemtype x;

nodetype *p;

if (lq->front == lq->rear)
return NULL;
else
{
p = lq->front->next;
lq->front->next = p->next;

if (p->next == NULL)
lq->rear = lq->front;
x = p->data;
free(p);


return x;
}
}



0 0