队列的顺序数组c语言代码,队列-队列的顺序表示和实现
隊列-隊列的順序表示和實現
和順序棧相類似,在利用順序分配存儲結構實現隊列時,除了用一維數組描述隊列中數據元素的存儲區域之外,尚需設立兩個指針front和rear分別指示“隊頭”和“隊尾”的位置。
為了在C語言中描述方便,在此我們約定:初始化建空隊列時,令front=rear=0。每當插入新的隊列尾元素時,“尾指針增1”;每當刪除隊列頭元素時,“頭指針增1”。因此,在非空隊列中,頭指針始終指向隊列頭元素位置,隊尾指針始終指向隊列尾元素的下一個位置。如圖所示:
從圖中可以看到,隨著入隊出隊的進行,會使整個隊列整體向后移動,這樣就出現了循環隊列操作示意圖(d)中的現象(假溢出現象):隊尾指針已經移到了最后,再有元素入隊就會出現溢出,而事實上此時隊中并未真的“滿員”,這種現象為“假溢出”,這是由于“隊尾入隊頭出”這種受限制的操作所造成。解決假溢出的方法之一是將隊列看成頭尾相接的循環結構,頭尾指針的關系不變,將其稱為“循環隊列”,“循環隊列”的示意圖如下圖所示:
因為是頭尾相接的循環結構,
入隊時的隊尾指針加1操作修改為:q.rear=(q.rear+1) % MAXSIZE;
出隊時的隊頭指針加1操作修改為:q.front=(q.front+1) % MAXSIZE;
設MAXSIZE=10,下圖是循環隊列操作示意圖。
如上圖所示的循環隊可以看出,(a)中具有a5、a6、a7、a8四個元素,此時front=5,rear=9;隨著a9~a14相繼入隊,隊中具有了10個元素--隊滿,此時front=5,rear=5,如(b)所示,可見在隊滿情況下有:front==rear。若在(a)情況下,a5~a8相繼出隊,此時隊空,front=9,rear=9,如(c)所示,即在隊空情況下也有:front==rear。就是說“隊滿”和“隊空”的條件是相同的了。這顯然是必須要解決的一個問題。
方法之一是附設一個存儲隊中元素個數的變量如num,當num==0時隊空,當num==MAXSIZE時為隊滿。
另一種方法是少用一個元素空間,把圖(d)所示的情況就視為隊滿,此時的狀態是隊尾指針加1就會從后面趕上隊頭指針,這種情況下隊滿的條件是:(q->rear+1) % MAXSIZE == q->front,也能和空隊區別開。
隊列的順序存儲結構
typedef?struct?{
QElemtype?*base;//初始化的動態分配存儲空間
int?front;//隊頭指針
int?rear;//隊尾指針
}SqQueue;
循環隊列的實現
下面的循環隊列及操作按第二種方法實現。
#include?
#include?
#define?MAXSIZE?10
#define?OK?1
#define?ERROR?0
#define?OVERFLOW?-2
typedef?int?Status;
typedef?int?QElemtype;
typedef?struct?{
QElemtype?*base;//初始化的動態分配存儲空間
int?front;//隊頭指針
int?rear;//隊尾指針
}SqQueue;//循環隊列
//--------------------循環隊列的基本操作的算法描述------------------
Status?InitQueue(SqQueue?*q)
{//構造一個空隊列Q
q->base=(QElemtype*)malloc(MAXSIZE*sizeof(QElemtype));
if(!q->base)exit(OVERFLOW);//存儲分配失敗
q->front=?q->rear?=0;
return?OK;
}
int?queuelength(SqQueue?q)
{//返回Q的元素個數,即隊列的長度
return?(q.rear?-?q.front?+?MAXSIZE)?%?MAXSIZE;
}
Status?EnQueue?(SqQueue?*q,QElemtype?e)
{//插入元素e為Q的新的隊尾元素
if?((q->rear+1)?%?MAXSIZE?==?q->front)?return?ERROR;//隊列滿,不進行任何操作,不能再入隊
q->base[q->rear]=e;
//入隊的操作
q->rear=(q->rear+1)?%?MAXSIZE;
return?OK;
}
Status?DeQueue?(SqQueue?*q,QElemtype?*e)
{//若隊列不空,則刪除Q的對頭元素,用e返回其值,并返回OK;否則返回ERROR
if?(q->front==q->rear)?return?ERROR;//隊列滿
*e=q->base[q->front];?//指針的下標運算
q->front=(q->front+1)?%?MAXSIZE;
return?OK;
}
void?display_queue(SqQueue?*q){
if(q->front==q->rear){
printf("queue?is?empty!!\n");
}else?{
//遍歷該循環隊列
int?front?=?q->front;
int?rear?=?q->rear;
while(front!=rear){
printf("%d\n",q->base[front]);
++front;
}
}
}
int?main(){
SqQueue?q;
InitQueue(&q);
int?i;
for(i=0;i<11;i++){
if(EnQueue(&q,i)==ERROR){
printf("循環隊列已滿,該隊列長度為9?\n");
}
}
printf("the?length?of?queue?is?%d?\n",queuelength(q));?//the?length?of?queue?is?9
int?e1,e2,e3,e4,e5;
DeQueue(&q,&e1);
DeQueue(&q,&e2);
DeQueue(&q,&e3);
DeQueue(&q,&e4);
DeQueue(&q,&e5);
printf("%d--%d--%d--%d--%d?\n",e1,e2,e3,e4,e5);
printf("the?length?of?queue?is?%d?\n",queuelength(q));
printf("循環隊列的遍歷\n");
display_queue(&q);
int?e6;
DeQueue(&q,&e6);
printf("循環隊列的遍歷\n");
display_queue(&q);
system("pause");
return?0;
}
運行結果:
循環隊列已滿,該隊列長度為9
循環隊列已滿,該隊列長度為9
the?length?of?queue?is?9
0--1--2--3--4
the?length?of?queue?is?4
循環隊列的遍歷
5
6
7
8
循環隊列的遍歷
6
7
8
請按任意鍵繼續.?.?.
注:數學中的余數其實就是取模運算
如,m模n (c語言表示 m%n )
x mod y = x % y
數學中的余數概念和我們的計算機中的余數概念一致,但實現卻不一致。
========END========
總結
以上是生活随笔為你收集整理的队列的顺序数组c语言代码,队列-队列的顺序表示和实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JQuery中的一些重要方法
- 下一篇: c语言 手机图形库,c语言的图形库 -