肥貓學習筆記--C語言數據結構與算法(二)----隊列

C語言數據結構與算法(二)

什麼是隊列

隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。

隊列的特性

隊列,顧名思義,就像排隊買東西一樣,排在前面買東西的買完走人,排在後面的要排着隊等到買完東西再走人,也就是先進先出,後進後出的順序

創建隊列

要想創建一個棧,我們首先需要一個結構體,其中有
1、元素
2、對頭
3、隊尾
4、數量
5、容量

#define TYPE int
typedef struct Queue
{
	TYPE* base;
	int size;	//容量
	int head;	//隊頭
	int tall;	//隊尾
	int cnt;	//數量
}Queue;

然後是創建隊列的函數

Queue* create_queue(int len)//創建
{
	Queue* queue=malloc(sizeof(Queue));
	queue->base = malooc(sizeof(TYPE)*len);
	queue->len = len;
	queue->head = 0;
	queue->tall = -1;
	queue->cnt = 0;//元素的數量
	return queue;
	}

對隊列進行操作

判斷隊列滿

隊滿的條件是隊列裏面的元素大於或等於隊列的長度

bool full_queue(Queue* queue)//隊滿
{
	if(queue->len <= queue->cnt)
		return true;
		return false;
	}

判斷隊列空

判斷隊列是否爲空就用cnt來進行判斷

bool empty_queue(Queue* queue)//隊空
{
	if(0 == queue->cnt)
	{
		return true;
		}
		return false;
	}

入隊

對於隊列來說,當入隊入滿,出隊完之後,隊頭和隊尾所指向的是隊列的最後一個元素,怎麼讓它回頭,回到最開始的地方是一個難點,在這裏我用的是使用除餘的方法

bool push_queue(Queue* queue, TYPE data)
{
	//1.判斷是否隊滿
	//2.回頭:指針指完最後一個又回到第一個
	if(full_queue(queue)) return false;
	queue->tall = (queue->tall+1) % queue->size;//%多少就是0-多少的數字,定義tall的初始值爲-1,所以要+1
	queue->base[queue->tall]=data;
	queue->cnt++;
	return true;
}

出隊

與入隊同理

bool pop_queue(Queue* queue)
{
	if(empty_queue(queue)) return false;
	queue->head = (queue->head+1) % queue->size;
	queue->base[queue->heal]=data;
	queue->cnt--;
	return true;
	}

隊頭元素

比較簡單,不再細說

TYPE* head_queue(Queue* queue)
{
	if(empty_queue(queue)) return NULL;
	return queue->base+queue->head;
	}

隊尾元素

TYPE*tall_queue(Queue* queue)
{
	if(empty_queue(queue)) return NULL;
	return queue->base+queue->tall;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章