數據結構中隊列的基本操作實現


       隊列是一種特殊的線性表,在這種線性表中,刪除運算限定在表的一段進行,而插入運算限定在表的另一端進行,通常,約定把允許插入的一端稱為隊尾,把允許刪除的一端稱為隊首。隊列進出的原則是先進隊的先出隊,即先進先出原則。隊列在計算機程序設計中經常被用到,如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、總結:上述主要描述的是隊列的鏈式存儲,只要記住隊列的特性,隊首刪除,隊尾插入,就會很輕松的寫出隊列的基本操作,后續還會繼續介紹循環隊列以及一些特殊的隊列。





注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com