数据结构-线性表之循环队列
文章目錄
- 一:循環(huán)隊列
- 二:實現(xiàn)
- (1)結構體定義
- (2)初始化
- (3)入隊
- (4)出隊
- (5)返回隊頭和隊尾
- 三:代碼
一:循環(huán)隊列
實現(xiàn)隊列要么使用數(shù)組,要么使用鏈表,但由于數(shù)組對于出隊和入隊這樣的操作效率不高,所以實現(xiàn)隊列一般使用鏈表。如果現(xiàn)在要求你使用順序表(也就是順序隊)來實現(xiàn)隊列,在不考慮操作的復雜性的情況下肯定是可以實現(xiàn)的,但是這會存在一個致命的問題——“假溢出”。如下,經(jīng)過一系列入隊出隊操作,某一刻出現(xiàn)越界。
一旦出現(xiàn)越界,這個隊列就等于“報廢”了
而解決這個問題可以用到循環(huán)隊列,循環(huán)隊列從感覺上講不是一個直鏈,而是一個圓環(huán),在某一刻隊滿時,此時還要入隊的話,隊頭指針便指向第一個元素,重復利用之前的空間
對于普通的順序隊,其判斷隊滿的條件為容量滿,對于循環(huán)隊來說,其判斷隊空和隊滿的條件有點不同
首先,隊空時自然rear=front,也即下圖
而后進隊兩個元素,進隊時arr[rear]=x,然后rear+1如下圖
繼續(xù)入隊,入到不能再入為止,此時rear=front,但是前面隊空時也有rear=front。
所以為了區(qū)分隊空和隊滿,必須犧牲掉一個元素的位置(圖中a8)這也就是為什么在申請空間時需要多申請一個原因。如下當元素到達a7時,即為設定的隊滿狀態(tài)。此時front=rear+1
在這樣一個循環(huán)隊列中,隊列空間為8個,下標范圍[0-7],當rear=7時隊滿。如果繼續(xù)入隊,rear就不能直接+1了,否則會越界。而要使得rear從rear=7跳到rear=0,可以rear=(rear+1)%8,因為任何一個數(shù)對8取余,其結果都會被映射在[0-7]內(nèi)。同時為了統(tǒng)一操作,將所有的rear=rear+1均改為rear=(rear+1)%8。
所以說隊空rear=front;隊滿front=(rear+1)%MaxSize;移動指針rear=(rear+1)%MaxSize和front=(front+1)%MaxSize;
二:實現(xiàn)
(1)結構體定義
(2)初始化
(3)入隊
(4)出隊
(5)返回隊頭和隊尾
三:代碼
CircularQueue.h
#pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h>typedef int DataType;typedef struct CircularQueue {int _front;int _rear;DataType* _arr;}CircularQueue;void CircularQueueInit(CircularQueue* pq);//初始化 void CircularQueuePush(CircularQueue* pq, DataType x);//入隊 void CircularQueuePop(CircularQueue* pq);//刪除 DataType CircularQueueHead(CircularQueue* pq);//隊頭 DataType CircularQueueTail(CircularQueue* pq);//隊頭CircularQueue.c
#include "CircularQueue.h"void CircularQueueInit(CircularQueue* pq) {pq->_front = 0;pq->_rear = 0;pq->_arr = (DataType*)malloc(sizeof(DataType)*(8+1)); }void print(CircularQueue* pq) {assert(pq);int cur = pq->_front;while (cur != pq->_rear){printf("%d ", pq->_arr[cur]);cur = (cur + 1) % 9;}}void CircularQueuePush(CircularQueue* pq, DataType x) {assert(pq);if ((pq->_rear + 1) % 9 == pq->_front)return;pq->_arr[pq->_rear] = x;pq->_rear = (pq->_rear + 1) % 9; } void CircularQueuePop(CircularQueue* pq) {assert(pq);if (pq->_rear == pq->_front)return;pq->_front=(pq->_front + 1) % 9; } DataType CircularQueueHead(CircularQueue* pq) {assert(pq);if (pq->_rear == pq->_front)exit(-1);return pq->_arr[pq->_front];} DataType CircularQueueTail(CircularQueue* pq) {assert(pq);if (pq->_rear == pq->_front)exit(-1);else{int cur = pq->_front;while ((cur + 1) % 9 != pq->_rear)cur = cur++;return pq->_arr[cur];}}test.c
#include "CircularQueue.h"void test() {CircularQueue CQ;CircularQueueInit(&CQ);CircularQueuePush(&CQ, 1);CircularQueuePush(&CQ, 2);CircularQueuePush(&CQ, 3);CircularQueuePush(&CQ, 4);print(&CQ);printf("\n");CircularQueuePop(&CQ);print(&CQ);printf("\n");printf("隊頭元素是%d \n", CircularQueueHead(&CQ));printf("隊尾元素是%d \n", CircularQueueTail(&CQ));} int main() {test(); }總結
以上是生活随笔為你收集整理的数据结构-线性表之循环队列的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (王道408考研数据结构)第三章栈和队列
- 下一篇: [Effective JavaScrip