隊列的順序存儲與鏈式存儲c語言實現
- 2020 年 6 月 30 日
- 筆記
一. 隊列
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=0; return Q; }
3.判斷隊列是否為空
int Queue_Empty(Queue Q) { if(Q.front==Q.rear&&Q.size==0) 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+1)%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+1)%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 0; } Queue InitQueue() { Queue Q; Q.front=Q.rear=Q.size=0; return Q; } int Queue_Empty(Queue Q) { if(Q.front==Q.rear&&Q.size==0) 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+1)%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+1)%MaxSize; q->size--; return TRUE; }
View Code
運行示例:
三. 隊列的鏈式存儲
鏈隊列:同時帶有隊頭指針和隊尾指針的單鏈表。
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 0; } 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; }
View Code
運行示例: