隊列
隊列(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 ;
}