1. 程式人生 > >資料結構中佇列的基本操作實現

資料結構中佇列的基本操作實現

       佇列是一種特殊的線性表,在這種線性表中,刪除運算限定在表的一段進行,而插入運算限定在表的另一端進行,通常,約定把允許插入的一端稱為隊尾,把允許刪除的一端稱為隊首。佇列進出的原則是先進隊的先出隊,即先進先出原則。佇列在計算機程式設計中經常被用到,如Windows作業系統的訊息佇列。

       接下來我們看一下佇列的資料結構,佇列可以採用鏈式或順序儲存結構來描述,這裡採用鏈式結構來進行表達。由於佇列需要在隊首以及隊尾進行刪除和插入操作,所以需要設定兩個指標來表示佇列,通常隊尾指標指向最後進入佇列的元素,為了便於表示空佇列,專門設定了一個頭結點,當佇列為空時,頭指標和尾指標均指向頭結點,佇列的基本操作有,構建一個空佇列、插入一個元素、刪除一個元素、計算佇列的長度、銷燬佇列。佇列的結構如下所示:


<span style="font-size:18px;">typedef struct lnode{
    elementype  data;
    lnode* next;
}lnode;

typedef struct linkque{
    lnode* front;
    lnode* rear;
}linkque;
</span>
1、構建一個空佇列。
<span style="font-size:18px;">
int QueueInti(linkque& q)
{
    //建立一個頭結點;
    lnode* head=(lnode*)malloc(sizeof(lnode));
    if(!head)
    {
        return 0;
    }
    q.front=head;
    q.rear=head;
    
    q.front->next=NULL;

    retuen 1;    
}
</span>

2、插入一個元素,插入一個元素把該元素插入到佇列的尾部,並且修改尾部指標指向剛插入的元素。

int QueueInsert(linkque& q,elementype e)
{
	lnode* p=(lnode*)malloc(sizeof(lnode));
	
	if(!p)
	{
		return 0
	}

	p->data=e;
	
	q.rear->next=p;
	
	q.rear=p;

	return 1;
}
3、從鏈式佇列q中刪除一個元素,如果佇列非空,則刪除佇列q中的隊首元素,用e返回其值。佇列中設定了頭結點,如果佇列中只有一個元素,刪除後佇列變為空佇列,需要將隊尾指標指向頭結點。
int QueueDelete(linkque& q,elementype &e)
{
	if(q.front==q.rare)
	{
		return 0;
	}
	
	lnode* p=q.front->next;
	
	e=p->data;
	
	q.front->next=p->next;
	
	if(q.rare==p) q.rare=q.front;

	free(p);
	
	return 1;	
}
4、計算佇列的長度,求佇列的長度,即計算佇列中元素的個數。
int QueueLength(linkque& q)
{
	int i=0;
	
	if(q.front==q.rara) return 0;
	
	lnode* p=q.front->next;	

	while(p)
	{
		++i;
		p=p->next;	
	}
	
	return (i);
}

5、銷燬一個佇列,銷燬一個佇列實際上是從鏈式佇列的頭部開始,將所有的節點(包括頭結點)的空間都進行回收。如下:
int QueueDestory(linkque& q)
{
	lnode* p;
	
	while(q.front)
	{
		q.rare=q.front->next;
		free(q.front);

		q.front=q.rare;		
	}	

	return 1;
}

6、總結:上述主要描述的是佇列的鏈式儲存,只要記住佇列的特性,隊首刪除,隊尾插入,就會很輕鬆的寫出佇列的基本操作,後續還會繼續介紹迴圈佇列以及一些特殊的佇列。