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;
}