佇列其實也是鍊錶,這裡講的是順序表示。佇列,顧名思義,就是排隊的隊形。按照專業一點就是fifo(first in first out) 原則,從對列頭出列,從對尾入列。
因為迴圈佇列最利用效率,也稍微增加了難度,所以要記住迴圈佇列的表示方法。
其實很多資料結構都有很多種寫法,重要是理解其思想,**完成只是讓自己更加透徹的掌握,每一種實現方式都是按其思想一步一步完成的。
先貼出結構體:
typedef struct queue queue;
如果不同的資料型別 int *base 的型別記得換,還有好多地方 ,記得就行了。
之所以用迴圈佇列,是因為對頭只能出,對尾只能入,這樣就變成了上面的位置空出後就一直空著了,造成了很大的浪費啊。
我之前學的時候迴圈佇列的時候就覺得很暈,主要是當時我的確太渣了,現在理解了其中的道理,感覺還是挺好玩的。迴圈的意思並沒有違背對頭對尾的概念,就像我在乙個圓圈上開了倆個洞,乙個標為頭,乙個標為尾,所以不管轉或不轉,我的標誌就在那兒。
我們這樣想,假如這個迴圈的圈圈,有6個位置,但是我們只裝5個數(**有注釋),
e→ d →c →b→ a 頭
下標是 4 3 2 1 0等到裝滿的時候便不能裝了,然後出對是不,那麼這時候a下標為0從頭出去了,那麼對頭就變成
q->front = (q->front+1) % q->size;
成為了1,然後有數f來入隊,那麼此時對尾變成了
q->rear = (q->rear +1)% q->size;
成為了0,看到了沒,就因為簡單的取餘的操作,我的下標永遠在0-4間迴圈,就成為了迴圈佇列。
好了,也許和我當初學的時候想的不一樣,以後還是覺得把剛學的知識,馬上寫出感受才好,新鮮又貼近最真實的感覺。
#include #include #include typedef struct queue queue;
void initqueue(queue *q, int size)
q->front = 0;
q->rear = 0;//初始化佇列裡沒有元素 下標為0
}void destroyqueue(queue *q)
void clearqueue(queue *q)
bool isempty(queue *q) else
return false;
}bool isfull(queue *q)
else
return false;
}bool gethead(queue *q, int *e) else
}int length(queue *q)
//出對入隊只要記著隊尾入隊,對頭出對即可。
bool enqueue(queue *q, int item)
else
return true;
}bool dequeue(queue *q, int *item)
return true;
}//測試程式
int main()
destroyqueue(&q);//佇列已經銷毀 任何操作都沒用了
//enqueue(&q,1);
gethead(&q,&a);
return 0;
}
簡單的python迴圈知識
我們在寫 時經常會用到迴圈,python中有for迴圈和while迴圈,我們來詳細的了解一下這兩種迴圈。python for迴圈可以遍歷任何序列的專案,如乙個列表或者乙個字串。我們通過乙個例子來看一下for迴圈的具體使用,我們通過range 函式建立乙個整數列表,然後將列表中的元素通過for迴圈列印...
迴圈佇列與鏈佇列的簡單實現
為充分利用向量空間,克服 假溢位 現象的方法是 將向量空間想象為乙個首尾相接的圓環,並稱這種向量為迴圈向量。儲存在其中的佇列稱為迴圈佇列 circular queue 通過上圖可以看出,如果使用順序表作為佇列的話,當處於d狀態則不能繼續插入新的隊尾元素,否則會因為陣列越界而導致程式 被破壞。當隊列為...
c 棧,佇列,迴圈佇列 簡單實現
棧 include using namespace std template struct node template class stack bool push const t e const t pop const t gtop bool empty int size bool clear pr...