队列
队列(queue)是一种先进先出的线性表。它只允许在表的一端进行插入,而在另一端进行删除。允许插入的一端叫做队尾(rear),允许删除的一端则称为对头(front)。队列的基本操作有入队(enqueue),即在表的尾端插入一个元素,出队(dequeue)它是删除在表的开头的元素。
同栈相同队列也有两种存储方法:一种使用数组,另一种是使用单链表。
1.队列的顺序表示
typedef struct queue
{
int data[MAXSIZE];
int front;
int rear;
}queue;
2.队列的链式存储结构
链队列需要两个指针分别指向队头和队尾,并且使头指针指向头结点,空的链队列的判断条件为头指针和尾指针均指向头结点。
其代码表示为
<span style="font-size:12px;">typedef struct QNode
{
int data;
struct QNode *next;
}QNode,*Queue;
typedef struct linkQueue
{
Queue front;
Queue rear;
}LinkQueueNode,*LinkQueue;</span><span style="font-size: 18px;">
</span>
链队列的入队和出队即为单链表的插入和删除操作。
void enQueue(LinkQueue queue,int e)
{
Queue p;
p = (Queue)malloc(sizeof(QNode));
p->data = e;
if(!p)
printf("full queue");
else
{
p->next =NULL;
queue->rear->next=p;
queue->rear=p;
}
return ;
}
void deQueue(LinkQueue queue,int *e)
{
if(queue->front==queue->rear)
return ;
Queue q;
q=queue->front->next;
*e=q->data;
queue->front->next=q->next;
if(queue->rear==q)
queue->rear=queue->front;
free(q);
return ;
}
3.循环队列
循环队列的数组表示为
# define MAXSIZE 100
typedef struct queue
{
int *base;
int front;
int rear;
}queue,*cirQueue;
其进队出队操作为:
void enQueue(cirQueue q,int e)
{
if(((q->rear+1) % MAXSIZE)==q->front)
return;
q->base[q->rear]=e;
q->rear=(q->rear+1)%MAXSIZE;
return ;
}
void deQueue(cirQueue q,int *e)
{
if(q->front==q->rear)
return;
*e = q->base[q->front];
q->front=(q->front+1)%MAXSIZE;
return ;
}