順序隊列一般實現為循環隊列,因為普通的隊列可能產生“假溢出”。
1 struct SqQueue{ 2 int data[maxSize]; 3 int front; 4 int rear; 5 };
循環隊列的兩個狀態:
1.隊空
qu.rear == qu.front
2.隊滿 (注意,循環隊列必須損失一個存儲空間,用來區分隊空和堆滿,如果隊列中的所有空間對被占滿,那么隊空和隊滿的狀態都是qu.front == qu.rear,導致無法區分)
(qu.rear+1)%maxSize == qu.front
循環隊列的兩個操作:
1.進隊
1 qu.rear = (qu.rear+1)%maxSize // 先移動指針,再存儲元素 2 qu.data[qu.rear] = x;
2.出隊
1 x = qu.data[qu.front]; // 先取元素,再移動指針 2 qu.front = (qu.front+1)%maxSize;
相關操作:
1 void InitQueue(SqQueue &qu) 2 { 3 qu.front = qu.rear = 0; 4 } 5 6 int QueueEmpty(SqQueue qu) 7 { 8 if(qu.front==qu.rear) 9 return 1; 10 else 11 return 0; 12 } 13 14 int enQueue(SqQueue &qu,int x) 15 { 16 if((qu.rear+1)%maxSize == qu.front) // 若隊滿,就不可再添加了 17 return 0; 18 qu.rear = (qu.rear+1)%maxSize; // 先移動指針,在存入元素 19 qu.data[qu.rear]=x; 20 return 1; 21 } 22 23 int deQueue(SqQueue &qu,int &x) 24 { 25 if(qu.front == qu.rear) // 若隊空,就不可以刪除了 26 return 0; 27 x = qu.data[qu.front]; // 先取出元素,再移動指針 28 qu.front = (qu.front+1)%maxSize; 29 return 1; 30 }
還有一個計算循環隊列中實際元素個數的式子:
1 n = (qu.rear - qu.front + maxSize) % maxSize;
鏈隊
兩個狀態:
1.隊空
lqu->rear == NULL 或 lqu->front == NULL
2.隊滿
不存在隊滿的情況。
兩個操作:
1.進隊 (假設p指向進隊元素)
1 lqu->rear->next = p; 2 lqu->rear = p;
2.出隊 (假設p指向出隊元素,也就是隊首元素)
1 p = lqu->front; 2 lqu->front = p->next; 3 x = p->data; 4 free(p);
相關操作:
1 //先定義結點 2 struct QNode{ 3 int data; 4 QNode *next; 5 }; 6 // 定義鏈隊 7 struct LQueue 8 { 9 QNode *front; 10 QNode *rear; 11 }; 12 13 void Init(LQueue *&lqu) 14 { 15 lqu = new LQueue; 16 lqu->front = lqu->rear = NULL; 17 } 18 19 int QueueEmpty(LQueue *lqu) 20 { 21 if(lqu->front == NULL||lqu->rear == NULL) 22 return 1; 23 else 24 return 0; 25 } 26 27 void enQueue(LQueue *&lqu,int x) 28 { 29 QNode *p = new QNode; 30 p->data = x; 31 p->next = NULL; 32 if(lqu->rear == NULL) 33 lqu->front = lqu->rear = p; 34 else{ 35 lqu->rear->next = p; 36 lqu->rear = p 37 } 38 } 39 40 int deQueue(LQueue *&lqu,int &x) 41 { 42 QNode *p; 43 if(lqu->rear == NULL) 44 return 0; 45 else 46 p=lqu->front; 47 48 if(lqu->front == lqu->rear) // 當鏈隊中只有一個結點時,特殊處理 49 lqu->front=lqu->rear=NULL; 50 else 51 lqu->front = lqu->front->next; 52 x=p->data; 53 free(p); 54 return 1; 55 }