1. 程式人生 > 實用技巧 >佇列的順序儲存與鏈式儲存c語言實現

佇列的順序儲存與鏈式儲存c語言實現

一. 佇列

1.佇列定義:只允許在表的一端進行插入,表的另一端進行刪除操作的線性表。

2.迴圈佇列:把儲存佇列的順序佇列在邏輯上視為一個環。

迴圈佇列狀態:

初始時:Q.front=Q.rear=0

front指標移動:Q.front=(Q.front+1)%MaxSize

rear指標移動:Q.rear=(Q.rear+1)%MaxSize

佇列長度:(Q.rear+MaxSize-Q.front)%MaxSize

隊空條件:Q.front=Q.rear

隊滿條件:Q.front=Q.rear

3.區分隊空和隊滿的三種處理

1)犧牲一個儲存單元來區分隊空和隊滿

隊滿條件:(Q.rear+1)%MaxSize=Q.front

隊空條件:Q.front=Q.rear

隊中元素個數:(Q.rear+MaxSize-Q.front)%MaxSize

2)型別中增設表示元素個數的資料成員

隊空條件:Q.front=Q.rear && Q.size=0

隊滿條件:Q.front=Q.rear && Q.size=MaxSize

3)型別中增設tag資料成員,以區分隊空還是隊滿

tag=0時,若因刪除導致Q.front=Q.rear,則為隊空

tag=1時,若因插入導致Q.front=Q.rear,則為隊滿

二. 迴圈佇列的順序儲存操作

1.結構描述

typedef struct Queue{
ElemType data[MaxSize];
int front,rear,size;
}Queue;

2.初始化佇列

Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=Q.size=;
return Q;
}

3.判斷佇列是否為空

int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear&&Q.size==)
return TRUE;
else
return FALSE;
}

4.判斷佇列是否為滿

int Queue_Full(Queue Q)
{
if(Q.front==Q.rear&&Q.size==MaxSize)
return TRUE;
else
return FALSE;
}

5.入隊

int InQueue(Queue *q)
{
if(Queue_Full(*q))
return FALSE;
ElemType x;
printf("輸入入隊元素:");
scanf("%d",&x);
q->data[q->rear]=x;
q->rear=(q->rear+)%MaxSize;
q->size++;
return TRUE;
}

6.出隊

int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
return FALSE;
*x=q->data[q->front];
q->front=(q->front+)%MaxSize;
q->size--;
return TRUE;
}

7.完整程式碼

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MaxSize 10
typedef int ElemType;
typedef struct Queue{
ElemType data[MaxSize];
int front,rear,size;
}Queue; Queue InitQueue();//初始化佇列
int Queue_Empty(Queue Q);//判斷佇列是否為空 ,用size來判斷空還是滿
int Queue_Full(Queue Q);//判斷佇列是否滿
int InQueue(Queue *q);//入隊
int OutQueue(Queue *q,ElemType *x);//出隊,並記錄出隊元素
int main()
{
ElemType x;
Queue Q=InitQueue();
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
printf("此時佇列長度:%d\n",Q.size);
return ;
} Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=Q.size=;
return Q;
} int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear&&Q.size==)
return TRUE;
else
return FALSE;
} int Queue_Full(Queue Q)
{
if(Q.front==Q.rear&&Q.size==MaxSize)
return TRUE;
else
return FALSE;
} int InQueue(Queue *q)
{
if(Queue_Full(*q))
return FALSE;
ElemType x;
printf("輸入入隊元素:");
scanf("%d",&x);
q->data[q->rear]=x;
q->rear=(q->rear+)%MaxSize;
q->size++;
return TRUE;
} int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
return FALSE;
*x=q->data[q->front];
q->front=(q->front+)%MaxSize;
q->size--;
return TRUE;
}

執行示例:

三. 佇列的鏈式儲存

鏈佇列:同時帶有隊頭指標和隊尾指標的單連結串列。

1.結構描述

typedef struct Node{
ElemType data;
struct Node *next;
}Node; typedef struct Queue{
struct Node *front,*rear;
}Queue;

2.鏈佇列初始化

Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=(Node*)malloc(sizeof(Node));
Q.front->next=NULL;
return Q;
}

3.判斷佇列是否為空

int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
}

4.入隊

void InQueue(Queue *q)
{
ElemType x;
printf("輸入入隊元素:");
scanf("%d",&x);
Node *p=(Node*)malloc(sizeof(Node));
p->data=x;
p->next=NULL;
q->rear->next=p;
q->rear=p;
}

5.出隊

int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
{
return FALSE;
}
Node *p=q->front->next;
*x=p->data;
q->front->next=p->next;
if(q->rear==p)
{
q->rear=q->front;
}
free(p);
return TRUE;
}

6.完整程式碼

#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}Node; typedef struct Queue{
struct Node *front,*rear;
}Queue; Queue InitQueue();//鏈佇列初始化
int Queue_Empty(Queue Q);//判斷佇列是否為空
void InQueue(Queue *q);//入隊
int OutQueue(Queue *q,ElemType *x);//出隊 int main()
{
ElemType x;
Queue Q=InitQueue();
InQueue(&Q);
InQueue(&Q);
InQueue(&Q);
OutQueue(&Q,&x);
printf("出隊元素:%d\n",x);
return ;
} Queue InitQueue()
{
Queue Q;
Q.front=Q.rear=(Node*)malloc(sizeof(Node));
Q.front->next=NULL;
return Q;
} int Queue_Empty(Queue Q)
{
if(Q.front==Q.rear)
return TRUE;
else
return FALSE;
} void InQueue(Queue *q)
{
ElemType x;
printf("輸入入隊元素:");
scanf("%d",&x);
Node *p=(Node*)malloc(sizeof(Node));
p->data=x;
p->next=NULL;
q->rear->next=p;
q->rear=p;
} int OutQueue(Queue *q,ElemType *x)
{
if(Queue_Empty(*q))
{
return FALSE;
}
Node *p=q->front->next;
*x=p->data;
q->front->next=p->next;
if(q->rear==p)
{
q->rear=q->front;
}
free(p);
return TRUE;
}

執行示例: