[數據結構]C語言隊列的實現(通俗易懂,跟風到底)

[數據結構]C語言隊列的實現http://www.cnblogs.com/racaljk/p/7822307.html

我個人把鏈表、隊列、棧分爲一類,然後圖、樹分爲一類。(串不考慮),分類的理由就是每一類有規律可循,即你能通過修改極少數的代碼把鏈表變成隊列、棧。(這裏我們不考慮其他諸如設計模式等因素),因此本貼在講完隊列之後還會歸納一下這一類數據結構的規律,幫助大家更好理解數據結構


首先需要知道隊列是什麼,這裏給一個定義:隊列是隻允許一段進行插入操作,一段進行刪除操作的線性表,隊列是先進先出的結構,允許插入成爲隊尾,允許刪除成爲隊頭



如上圖就是一個隊列,這裏我相信你已經對隊列有了一個概念了吧,於是就可以繼續看下面了


隊列同樣存在插入刪除操作,由於我們這裏討論的是鏈式隊列的實現,所以不存在隊列滿的情況


學了這麼多章數據結構我相信你能很容易的寫出隊列的結構了:

  1. struct node{  
  2.     char data;  
  3.     struct node *next;  
  4. };  
  5.   
  6. struct queue{  
  7.     struct node *front;  
  8.     struct node *rear;  
  9. };  
就如上完成了一個隊列的結構定義,然後是創建一個空隊列:

  1. struct queue *create_queue(){  
  2.     struct queue *q=new queue;  
  3.     q->front=NULL;  
  4.     q->rear=NULL;  
  5.     return q;  
  6. }  
這沒什麼說的,隊頭隊尾都指向NULL表示空隊列。

然後來考慮入隊操作:

如上圖,我們希望把e節點插入到這個隊列裏面,其實細心的朋友可能已經發現了這其實就是鏈表的尾部插入,沒錯,等一下我會總結一下這些規律
,這裏暫且不談。


我們能很容易寫出下面插入節點到隊列的代碼(如果不能你就要發反思是否認真學習了):

  1. void en_queue(struct queue *q,char c){  
  2.     struct node *e=new node;  
  3.     if(!n){  
  4.         return;  
  5.     }  
  6.     e->data=c;  
  7.     e->next=NULL;  
  8.     if(q->rear==NULL){  
  9.         q->front=q->rear=e;  
  10.     }else{  
  11.         q->rear->next=e;  
  12.         q->rear=e;  
  13.     }  
  14. }  
這裏稍作解釋,後面的if用於判斷是否隊列爲空,如果爲空就讓隊頭等於隊尾等於新節點,然後新節點爲隊尾。如果隊列不是空就按鏈表式尾插法進行插入

然後出隊:


看着上面的圖片如果你能與鏈表聯繫起來並想到這就是鏈表的頭插法的逆向,那就說明你真的學懂了


我們只需要把front的next指向a2,然後把,然後刪除a1即可完成出隊,同樣,要想刪除a1就應該創建一個臨時變量

代碼如下:

  1. void out_queue(struct queue *q){  
  2.    struct node * temp;  
  3.    
  4.    if(q->front==NULL)  
  5.       return;  
  6.    if(q->front==q->rear)  
  7.    {  
  8.       q->front=q->rear=NULL;  
  9.       return;  
  10.    }  
  11.    
  12.    temp=q->front;  
  13.    q->front=temp->next;  
  14.    delete temp;  
  15. }  
這裏也簡單解釋一下,首先判斷如果隊列爲空就不存在出隊了,所以直接返回,如果隊頭等於隊尾,也就是隻有一個元素,就讓隊頭隊尾指向NULL(其實這裏還可以刪除隊頭),最後返回


遍歷操作也順利成章:

  1. void print(struct queue *q){  
  2.     struct node *n=q->front;  
  3.     while(n!=NULL){  
  4.        std::cout<< n->data;  
  5.        n=n->next;  
  6.     }  
  7. }  
至此隊列結束,考慮到排版問題,對着三種結構的總結放到下面一片文章。



作者:racaljk


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章