隊列即可以用鏈表實現也可以用順序表實現,跟棧相反的是,棧一般用順序表實現而隊列用鏈表來實現,簡稱為鏈隊列,我們將隊頭指針指向鏈隊列的頭結點,隊尾指針指向終端結點(頭結點不是必要的,但為了方便操作我們加上了頭結點)。
一、隊列的鏈式存儲
1、鏈隊列的存儲結構
//隊列的存儲結構 typedef struct QNode{ ElemType data; struct QNode *next; }QNode,*QueuePtr; typedef struct{ QueuePtr front; //隊頭指針 QueuePtr rear; //隊尾指針 }LinkQueue;
2、初始化一個隊列
創建一個隊列要完成兩個任務,一是在內存中創建一個頭結點,二是將隊列的頭指針和頭結點指向這個生成的頭結點,此時是空隊列
//創建一個隊列 Status InitQueue(LinkQueue &q){ q->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); if( !q->front ) exit(0); q->front->next = NULL; return OK; }
3、入隊操作
//入隊操作 Status InsertQueue(LinkQueue &q, ElemType e){ QueuePtr p; p = (QueuePtr)malloc(sizeof(QNode)); if( p == NULL ) exit(0); p->data = e; p->next = NULL; q->rear->next = p; q->rear = p; return OK; }
4、出隊操作
//出隊操作 Status DeleteQueue(LinkQueue &q, ElemType &e){ QueuePtr p; if(q->front == q->rear) return ERROR; p = q->front->next; e = p->data; q->front->next = p->next; if( q->rear == p ) q->rear = q->front; free(p); return OK; }
5、銷毀一個隊列
//銷毀一個隊列 DestroyQueue(LinkQueue &q){ while( q->front ){ q->rear = q->front->next; free(q->front); q->front = q->rear; } return OK; }
二、隊列的順序存儲
1、定義一個循環隊列
//定義一個循環隊列 #define MAXSIZE 100 typedef struct{ ElemType *base; //用於存放內存分配基地址 int front; int rear; };
2、初始化循環隊列
//初始化循環隊列 Status InitQueue(SqQueue &q){ q->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType)); if( !q->base ) exit(0); q->front = q->rear = 0; return OK; }
3、入隊操作
//入隊列操作 Status InsertQueue(SqQueue &q,ElemType e){ if( (q->rear+1)%MAXSIZE == q->front ) return ERROR; //隊滿 q->base[q->rear] = e; q->rear = (q->rear+1)%MAXSIZE; return OK; }
4、出隊操作
//出隊操作 Status DeleteQueue(SqQueue &q,ElemType &e){ if(q->front = q->rear) return ERROR; e = q->base[q->front]; q->front = (q->front+1)%MAXSIZE; return OK; }