C語言--隊列(FIFO)

1、隊列的定義

隊列是一種先進先出(FIFO)的線性表,它只允許在表的一端進行插入,而在另一端刪除元素。這和我們日常生活中排隊是一樣的,最早進入隊列的元素最早離開。

在隊列中,允許插入的一端叫做隊尾(rear),允許刪除的一端則稱爲隊頭(front)

2、隊列的基本操作

3、隊列的分類

隊列包含兩種形式:鏈隊列和順序隊列。

3.1、鏈隊列

用鏈表表示的隊列簡稱爲鏈隊列。一個鏈隊列包含兩個分別指向隊頭和隊尾的指針(分別成爲頭指針和尾指針)。

3.1.1  單鏈隊列的定義:

//隊列的鏈式存儲結構
typedef struct QNode{
	QElemType data;
	struct QNode *next;
}Qnode,*Queneptr;	

typedef struct{
	Queneptr front;//隊頭指針
	Queneptr rear;//隊尾指針
}LinkQuene;	

3.1.2  基本操作

約定:
        隊空:s.front=s.rear(有頭結點)
        s.front=NULL(無頭結點)
        鏈隊無隊滿的情況(假定內存足夠大)

(1)構造一個空隊列

Status  init_quene(LinkQuene &s)
{
    s.front=(Queneptr *)malloc(sizeof(Qnode));
    if(!s.front)
        exit(OVERFLOW);
    s.rear=s.front;
    s.front->next=NULL;

    return  OK;
}

(2)銷燬隊列

Status destory_quene(LinkQuene &s,QElemType &e)
{
    while(s.front)
    {
        s.rear = s.front->next;
        free(s.front);
        s.front = s.rear;
    }
    
    retrun  OK;
}

(3)入隊

//插入元素e爲S的新的隊尾元素
Status  en_quene(LinkQuene &s,QElemType e)
{
    Queneptr p=(Queneptr *)malloc(sizeof(Qnode));
    if(!p)
        exit(OVERFLOW);
    p->data=e;
    p->next=NULL;
    s.rear->next=p;
    s.rear=p;

    return  OK;
}

(4)出隊

Status  de_quene(LinkQuene &s,QElemType &e)
{
    if(s.rear == s.front)
    {
        retuen ERROR;
    }
    Queneptr p=s.front->next;
    e=p->data;
    s.front->next=p->next;
    if(s.rear==p)
        s.rear=s.front;
    free(p);

    return  OK;
}

3.2、順序隊列

      在隊列的順序存儲結構中,除了用一組地址連續的存儲單元依次存放從隊列頭到隊列尾的元素之外,尚需附設兩個指針 front和 rear 分別指示隊列頭元素及隊列尾元素的位置。

3.2.1  順序隊列的定義

#define  MAXQSIZE    100    //最大隊列長度
typedef struct
{
   QelemType  *base;        //初始化的動態分配存儲空間
   int front;               //頭指針,若隊列不空,指向隊列頭元素
   int rear;                //尾指針,若隊列不空,指向隊列尾元素的下一個位置
   
}squene;

約定:

       空隊列 :Q.front=Q.rear
       隊滿 :Q.front=(Q.rear+1)%MAXSIZE
      入隊: Q.rear++
      出隊: Q.front++
      非空隊列:front始終指向隊頭元素,rear始終指向隊尾元素的下一位置
      每插入一個元素,rear=(rear+1)%(MAXSIZE)
      每刪除一個元素,front=(front+1)%(MAXSIZE)

3.2.2  順序隊列的基本操作

(1)構造一個空隊列

Status  init_quene(squene &s)
{
    s.base=(QelemType *)malloc(sizeof(QelemType));
    if(!s.base)
        exit(OVERFLOW);  //存儲分配失敗
    s.front = s.rear =0;
	
    return  OK;
}

(2)求隊列的元素個數,即隊列的長度

int queue_length(squene s)
{
    //return (s.rear-s.front+1) % MAXSIZE;
    return (s.rear-s.front+MAXSIZE) % MAXSIZE;
}	

(3)入隊

//插入元素e 爲隊列 s 的新的隊尾元素
Status en_quene(squene &s,QelemType e)
{
    if(((s.rear+1) % MAXSIZE) == s.front)
    {
        return  ERROR;
    }
    s.base[s.rear] = e;
    s.rear = (s.rear+1) % MAXSIZE;

    return  OK;
}	

(4)出隊
 

Status de_quene(squene &s,QelemType e)
{
    //若隊列不空,則刪除 s 的的隊頭元素,用 e 返回其值,並返回 OK 
    if(s.rear==s.front)
    {
        return  ERROR;
    }
    e = s.base[s.front];
    s.front = (s.front+1) % MAXSIZE;
}

4、其他總結不錯的博客

《C語言實現隊列的定義及其基本操作》

《隊列基本操作》

《c語言之隊列結構》

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