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;
}
}