數據結構——順序存儲的循環隊列

## 隊列的定義

**隊列是隻允許在一端進行插入操作,在另一端進行刪除操作的線性表,允許插入(也稱入隊,進隊)的一端叫隊尾,允許刪除(也叫出隊)的一端叫做對頭,隊列具有先進先出的特點。**

**在順序隊列中,隨著隊列的插入刪除操作,整個隊列向數組中下標較大的位置移動,從而產生隊列的單向移動性。當元素被插入到數組中下標最大的位置時,數組的空間就用完了,儘管此時數組的低端還有空閒空間,這種現象叫假溢出。

為了解決這種假溢出,可以將存儲隊列的數組看做成頭尾相接的循環結構,即循序隊列。**

## 順序存儲的循環隊列

```

#include

#include

//定義數組的最大長度

#define QueueSize 100

//定義隊列元素的數據類型,為int

typedef int DataType;

typedef struct {

DataType data[QueueSize];

int front;

int rear;

}CirQueue;

//循環隊列的初始化

void InitQueue(CirQueue ** Q){

(*Q)->front = (*Q)->rear = QueueSize-1;

}

//循環隊列的銷燬:循環隊列是靜態存儲分配,

//在循環隊列變量退出作用域自動釋放所佔內存單元,順序存儲的循環隊列無需銷燬

//入隊操作

int EnQueue(CirQueue ** Q , DataType x){

if(((*Q)->rear + 1)%QueueSize == (*Q)->front){

printf("上溢錯誤,入隊失敗");

return 0;

}

//隊尾位置在循環意義上加1

(*Q)->rear = ((*Q)->rear + 1) % QueueSize;

//在隊尾插入元素

(*Q)->data[(*Q)->rear] = x;

return 1;

}

//出隊操作

int DeQueue(CirQueue ** Q,DataType * ptr){

if((*Q)->rear == (*Q)->front){

printf("下溢錯誤,刪除失敗");

return 0;

}

(*Q)->front = ((*Q)->front + 1)%QueueSize;

*ptr = (*Q)->data[(*Q)->front];

return 1;

}

int GetHead(CirQueue * Q,DataType * ptr){

int i;

if(Q->rear == Q->front){

printf("下溢錯誤,取隊頭失敗");

}

i = (Q->front + 1)%QueueSize;

*ptr = Q->data[i];

return 1;

}

int Empty(CirQueue * Q)

{

if(Q->rear == Q->front){

return 1;

}else{

return 0;

}

}

int main(){

DataType x;

CirQueue * Q;

InitQueue(&Q);

EnQueue(&Q,5);

EnQueue(&Q,4);

EnQueue(&Q,3);

EnQueue(&Q,2);

EnQueue(&Q,1);

if(GetHead(Q,&x) == 1)

printf("當前隊頭元素為:%d\n",x);

if(DeQueue(&Q,&x) == 1)

printf("執行一次出隊操作,出隊元素為%d\n",x);

if(GetHead(Q,&x) == 1)

printf("當前隊頭元素為:%d\n",x);

if(DeQueue(&Q,&x) == 1)

printf("執行一次出隊操作,出隊元素為%d\n",x);

if(GetHead(Q,&x) == 1)

printf("當前隊頭元素為:%d\n",x);

if(Empty(Q) == 1){

printf("隊列為空\n");

}else{

printf("隊列非空\n");

}

return 0;

}

![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181028165935250.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2N6eGxqeTk5OQ==,size_27,color_FFFFFF,t_70)


分享到:


相關文章: