隊列(Queue)是隻容許在一端進行插入,而在另外一端進行刪除的運算受限的線性表html
容許刪除的一端稱爲隊頭(Front)。web
容許插入的一端稱爲隊尾(Rear)。算法
當隊列中沒有元素時稱爲空隊列。
測試
隊列的修改是依先進先出的原則進行的。動畫
新來的成員老是加入隊尾(即不容許"加塞"),每次離開的成員老是隊列頭上的(不容許中途離隊),即當前"最老的"成員離隊。ui
(1)InitQueue(Q)spa
置空隊。構造一個空隊列Q。(2)QueueEmpty(Q)3d
判隊空。若隊列Q爲空,則返回真值,不然返回假值。(3) QueueFull(Q)指針
判隊滿。若隊列Q爲滿,則返回真值,不然返回假值。(4) EnQueue(Q,x)code
若隊列Q非滿,則將元素x插入Q的隊尾。此操做簡稱 入隊。(5) DeQueue(Q)
若隊列Q非空,則刪去Q的隊頭元素,並返回該元素。此操做簡稱 出隊。(6) QueueFront(Q)
若隊列Q非空,則返回隊頭元素,但不改變隊列Q的狀態。#define MaxQSize 100 //應根據具體狀況定義該值 typedef char QElemType; //QElemType的類型依賴於具體的應用 typedef struct { QElemType * base; //初始化的動態分配存儲空間 int front; //頭指針,隊非空時指向隊頭元素 int rear; //尾指針,隊非空時指向隊尾元素的下一位置 }CirQueue;
if(i+1 == MaxQSize) // i 表示front或rear i=0; else i++;
i = (i+1) % MaxQSize;
bool InitQueue(CirQueue * Q) { Q->base = (QElemType *)malloc(MaxQSize * sizeof(QElemType)); if(!Q->base) exit(OVERFLOW); //分配內存失敗 Q->front = Q->rear = 0; //初始化爲空棧 return true; }
bool QueueEmpty(CirQueue * Q) {//由於少用一個元素,因此只有空隊列纔有 front = rear if (Q->front == Q->rear) { return true; } else return false; }
bool QueueFull(CirQueue * Q) {//若是插入後尾指針的位置等於頭指針的位置,則說明隊列滿了 if ((Q->rear + 1) % MaxQSize == Q->front) { return true; } else return false; }
bool EnQueue(CirQueue * Q, QElemType e) {//插入元素e if (QueueFull(Q)) {//若是隊滿,則返回false return false; } Q->base[Q->rear] = e; //插入元素 Q->rear = (Q->rear + 1) % MaxQSize; //修改尾指針 return true; }
bool DeQueue(CirQueue * Q, QElemType * e) { if (QueueEmpty(Q)) {//若是隊空,則返回false return false; } *e = Q->base[Q->front]; //返回元素值 Q->front = (Q->front + 1) % MaxQSize; //修改頭指針 }
typedef struct QNode { QElemType data; //數據域 struct QNode * next; //指針域 }QNode, *QueuePtr; typedef struct { QueuePtr front; //隊頭指針 QueuePtr rear; //隊尾指針 }LinkQueue;
bool InitQueue(LinkQueue * Q) { Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));//建立頭結點 if (!Q->front) {//若是內存分配失敗 exit(OVERFLOW); } Q->front->next = NULL; //初始化空隊列 return true; }
bool DestroyQueue(LinkQueue * Q) { while(Q->front) { Q->rear = Q->front->next;//用rear暫時存儲新的隊頭指針 free(Q->front); //釋放內存 Q->front = Q->rear; } return true; }
bool EnQueue(LinkQueue * Q, QElemType e) { QueuePtr p = (QueuePtr)malloc(sizeof(QNode));//爲新元素分配內存 if (!p) { exit(OVERFLOW); } p->data = e; //初始化新結點 p->next = NULL; Q->rear->next = p; //修改尾指針 Q->rear = p; return true; }
bool DeQueue(LinkQueue * Q, QElemType * e) { if (Q->front == Q->rear) {//若是隊空 return false; } QueuePtr p = Q->front->next; //保存第一個結點的位置 *e = p->data; Q->front->next = p->next; //第一個結點出隊 if (Q->rear == p) {//若是隻有一個結點,置爲空隊 Q->rear = Q->front } free(p); return true; }